2013-12-13 20 views
0

考慮以下幾點:PHP的 - 如何設置正則表達式邊界和不匹配非字母數字字符?

$text = 'c c++ c# and other text'; 
$skills = array('c','c++','c#','java',...); 

foreach ($skill as $skill) { 
    if (preg_match('/\b'.$skill.'\b/', $text)) { 
     echo $skill.' is matched'; 
    } 
} 

在 'C' 的情況下,它匹配 'C', 'C#',和 'C++'。我嘗試在最後加上assertion(?= \ s)或[\ s |。]來代替\ b,但它需要類似於\ b的東西。

我已經簽出了其他帖子,但似乎並沒有確切的情況。謝謝!

回答

2

問題是\b匹配c+#。你需要的東西是這樣的:

$text = 'c c++ c# and other text'; 
$skills = array('c','c++','c#','java'); 

foreach ($skills as $skill) { 
    if (preg_match('/(?<=^|\s)'.preg_quote($skill).'(?:\s|$)/', $text)) { 
     echo $skill.' is matched'; 
    } 
} 

文本時由字符串(^),或在開始一個空間,任開始之前和之後的字符串($)的任何一個結束這符合或最後一個空間。

因爲c++包含正則表達式特殊字符,所以您需要使用preg_quote(),就像我上面所做的那樣。

此外,請注意您原始代碼中的foreach ($skills ...)中的錯字(缺少s)。

+0

非常感謝,幫助! – user10132

0

問題的一部分是,C++中有正則表達式的字符。您應該使用$技巧上的preg_quote。然後使用你的後退和前進參考解決方案。

另一個問題是,你需要雙重轉義特殊字符,因爲PHP也使用\作爲字符串中的轉義字符。

相關問題