2016-09-26 77 views
1

我有一個奇怪的情況,其中積極lookahead按預期工作,但負面展望沒有。請看看下面的代碼:負面展望未按預期工作

<?php 

$tweet = "RT @Startup_Collab: @RiseOfRest is headed to OMA & LNK to #showcase our emerging #startup ecosystem. Learn more! https://example.net #Riseof…"; 

$patterns=array(
    '/#\w+(?=…$)/', 
); 

$tweet = preg_replace_callback($patterns,function($m) 
{ 
    switch($m[0][0]) 
    { 
     case "#": 
      return strtoupper($m[0]); 
     break; 
    } 
},$tweet); 


echo $tweet; 

我想匹配後面沒有…$和大寫它(在現實中,它會與href但爲了簡單起見,只大寫它被解析出來的任何主題標籤現在)。

這些都是正則表達式與它們對應的輸出:

'/#\w+(?=…$)/'匹配任何主題標籤與…$和大寫它結束,按預期工作:

RT @Startup_Collab: @RiseOfRest is headed to OMA & LNK to #showcase our emerging #startup ecosystem. Learn more! https://example.net #RISEOF… 

'/#\w+(?!…$)/'匹配任何主題標籤與…$和上沒有不散 - 它不起作用,所有主題標籤都是大寫:

RT @Startup_Collab: @RiseOfRest is headed to OMA & LNK to #SHOWCASE our emerging #STARTUP ecosystem. Learn more! https://example.net #RISEOf… 

非常感謝您的幫助,建議,想法和耐心。

- 天使

回答

2

這是因爲回溯匹配哈希標籤的一部分。使用所有格量詞避免回溯到\w+子模式:

/#\w++(?!…$)/ 
    ^^ 

regex demo

現在,1個或多個單詞字符匹配,而(?!…$)負前瞻匹配這些字字符後只執行一次。如果出現false結果,則不會發生回溯,並且整個匹配失敗。

查看更多關於possessive quantifiers的地方。

+1

每天你都會學到新東西,謝謝。 –