2015-08-31 114 views
0

我有一個函數,它使用preg_match來檢查子字符串是否在另一個字符串中。 今天,我意識到如果子字符串具有像特殊正則表達式字符(。\ + *?[^] $(){} =!| | - - )或@的尾部特殊字符,我的preg_match甚至找不到子字符串儘管它在那裏。preg_match:找不到具有尾部特殊字符的子字符串

This works,returns「A match was found。」

$find = "website scripting"; 
$string = "PHP is the website scripting language of choice."; 

if (preg_match("/\b" . $find . "\b/i", $string)) { 
    echo "A match was found."; 
} else { 
    echo "A match was not found."; 
} 

但是這不,返回「找不到匹配」。

$find = "website scripting @"; 
$string = "PHP is the website scripting @ language of choice."; 

if (preg_match("/\b" . $find . "\b/i", $string)) { 
    echo "A match was found."; 
} else { 
    echo "A match was not found."; 
} 

我試過preg_quote,但它沒有幫助。

謝謝你的任何建議!

編輯:字邊界是必需的,這就是爲什麼我使用\ b。我不想在「智能手機」中找到「手機」。

+0

'preg_quote'應該工作,你可以重複出'preg_quote($找到)'' – MarshallOfSound

+1

將preg_quote'無法正常工作,因爲你有'末\ B'。如果您不需要檢查末尾的單詞邊界,請將其刪除。 –

+0

這完全不清楚你想要什麼樣的行爲,像')@#* $ ek2'或'abc%'或'abcdef'(注意最後一個空格)。 – nhahtdh

回答

3

你可以只檢查,如果周圍的搜索詞的字符不是單詞字符查找變通:

$find = "website scripting @"; 
$string = "PHP is the website scripting @ language of choice."; 

if (preg_match("/(?<!\\w)" . preg_quote($find, '/') . "(?!\\w)/i", $string)) { 
    echo "A match was found."; 
} else { 
    echo "A match was not found."; 
} 

IDEONE demo

結果:A match was found.

注意所使用的雙斜線\w in (?<!\\w) and (?!\\w),因爲您必須轉換插值字符串中的正則表達式特殊字符。

preg_quote函數是必需的,因爲搜索詞 - 從我所看到的 - 可以有特殊字符,如果打算與文字字符相匹配,它們中的一些必須被轉義。

UPDATE

還有就是要建立與關鍵字周圍巧妙安置字邊界正則表達式的方式,但與上面的方法相比,性能會變差。下面是示例代碼:

$string = "PHP is the website scripting @ language of choice."; 

$find = "website scripting @"; 
$find = preg_quote($find); 
if (preg_match('/\w$/u', $find)) { // Setting trailing word boundary 
    $find .= '\\b'; 
} 
if (preg_match('/^\w/u', $find)) { // Setting leading word boundary 
    $find = '\\b' . $find; 
} 

if (preg_match("/" . $find . "/ui", $string)) { 
    echo "A match was found."; 
} else { 
    echo "A match was not found."; 
} 

another IDEONE demo

+2

如果目標是匹配「腳本@」在這些情況下「腳本@」或「腳本@」,而不是在這些情況下腳本@@「或腳本@a」'。 –

+0

@CasimiretHippolyte:只是關閉這個問題,因爲不清楚。只用一個例子。 OP要求我們猜測這些邊緣情況。 – nhahtdh

+0

@ Jonny5:謝謝,我錯過了那部分,現在更新了。卡西米爾,至於這是否能夠全面解決問題,在大多數情況下,只需檢查關鍵字前後的單詞字符即可。 –

0

如果您嘗試從另一個字符串找到一個字符串,可以strpos()

Ex。

<?php 

$find = "website scripting"; 
$string = "PHP is the website scripting language of choice."; 

if (strpos($string,$find) !== false) { 
    echo 'true'; 
} else { 
    echo 'false'; 
} 
+1

嚴格地說,'stripos'可能會有所幫助,因爲搜索不區分大小寫,但整個單詞要求(即關鍵字周圍沒有更多字母或數字或下劃線)呢? –

相關問題