2012-03-15 82 views
1

我正在使用PHP來查找以特殊正則表達式字符開頭的字符串是否作爲文本字符串中的單詞出現。這是PHP代碼:如何使用PHP搜索以特殊正則表達式字符開始/結尾的單詞字符串?

$subject = " hello [hello [helloagain "; 
$pattern = preg_quote("[hello"); 
if (preg_match("/\b" . $pattern . "\b/", $subject, $dummy)) { 
    echo "match"; 
} else { 
    echo "no match"; 
} 

模式以字符[,因此,preg_quote()用於轉義它。有一個的實例[你好作爲主題中的一個詞,所以應該有一個匹配,但上面的preg_match()返回不匹配。我認爲原因是在這個主題中,一個特殊字符不被認爲是一個單詞的開始或結束,但我想不出任何想法?謝謝。

回答

0

你是正確的,一個字邊界將不符合一個空格和一個[符號。

而不是使用單詞邊界可以明確地搜索空間(和其他分隔符如逗號,如果你希望時間)之前和之後單詞:

if (preg_match("/(\s|^)" . $pattern . "(?=\s|$)/", $subject, $dummy)) { 
+0

非常感謝。它解決了這個問題,但我寧願不列出所有可能的分隔符。我還需要計算主題中模式的出現次數。我嘗試了一個稍微修改的主題,如下所示: '$ subject =「hello [hello [hello [helloagain';' '$ pattern = preg_quote(」[hello「);' 'echo preg_match_all(」/( (\ s | $)/「,$ subject,$ dummy);' preg_match_all()返回1而不是2(現在有兩個實例 [你好主題由一個空格分隔),爲什麼? – user646234 2012-03-15 20:08:40

+0

@ user646234:正則表達式匹配不能重疊。爲了解決這個問題,請使用前瞻。我已經更新了答案。備註供將來參考:如果您在開始時陳述完整要求,您將得到更好的答案。 – 2012-03-15 20:10:08

+0

再次感謝馬克。 – user646234 2012-03-15 20:26:45

1

如果我理解正確的問題,你可以只使用strpos()有前導空格分隔單詞:

$subject = " hello [hello [helloagain "; 
$pattern = " [hello"; 

if(strpos($subject, $pattern) !== FALSE) 
    // ... 
else 
    // ... 

我覺得用REG-EX這裏實際上是一個更好的方法,因爲你正在尋找特殊REG-EX字符,如果您使用strpos(),則不需要轉義。

在所有情況下都需要進行一些修改才能正確使用,但是當我嘗試使用時會發生這種情況。

+0

謝謝。正如我在上面對_Mark_Byers_的評論中所述,我還需要將模式的出現次數統計爲一個單詞,因此,我決定使用正則表達式。 – user646234 2012-03-15 20:15:35

相關問題