2014-04-25 85 views
1

我想測試一個字符串的所有模式匹配的幾個單詞是單詞的開頭。如果不是所有模式都匹配,我想將查詢視爲False。單詞測試的開始正在起作用,但是我得到了重複的匹配,我覺得很驚訝,因爲一旦找到一個單詞匹配,就不會再對該單詞進行測試。也許我需要以某種方式將測試限制爲一場比賽。PHP preg_match_all與多個字

我想象,如果我是測試3分的話,那麼一個成功的測試將返回3.

返回值是在誤導你可以從例子中看到。我獲得了一個正面的價值,這比我正在測試的單詞數量還要多。在不匹配組的情況下,由於某些單詞的多次匹配,我仍然得到比要測試的單詞數更高的值。

我想我還沒有完全理解某些東西或者某種方式,我需要強制一個AND的情況。

我已經搜索了答案,但似乎沒有特定於我的問題。

$image = 'After A!!BC DEF hello bugggy bad Sled bob bobert robob Triumph 2000 Roadster clearing bobby Sledmere^August 2014^error'; 

$result = preg_match_all($query, $image, $matches); 

$query = '#\b(bob|bug|sled)#i'; // ALL MATCH 
Return Value 6 [ bob x 3, bug x 1, sled x 1] 

$query = '#\b(bob|bug|led)#i'; // Two matches 'led' fails 
Return Value 4 [ bob x 3, bug x 1, led x 0] 
+0

如果我沒有理解好要檢查所有的話只存在一個時間? –

+0

不,我想知道模式中的所有單詞至少匹配一次。 – mcl

回答

1

您可以使用多個向前看符號:

$text = 'After A!!BC DEF hello bugggy bad Sled bob bobert robob Triumph 2000 Roadster clearing bobby Sledmere^August 2014^error'; 
$pattern = '~(?=.*\bbob)(?=.*\bbug)(?=.*\bsled)~i'; 
if (preg_match($pattern, $text)) echo 'OK!'; 
+0

這在我的測試返回0。 – mcl

+0

@mcl:你是否用「bob」修正了「bod」? –

+0

對不起,我錯過了。我現在得到1的回報,這可能是我想要的。我會做進一步的測試並回來。 – mcl

0

試試這個

$image = 'After A!!BC DEF hello bugggy bad Sled bob bobert robob Triumph 2000 Roadster clearing bobby Sledmere^August 2014^error'; 

$query = '#\b(bob|bug|sled)(.*?) #i'; // ALL MATC 

preg_match_all($query, $image, $matches); 

print_r($matches[0]); 
+0

據我所知,字符串在任何單詞的開始處必須包含「bob」,「bug」和「sled」 - 全部**,或返回false - 如果** any * *這些詞語在任何詞的開頭都有;而不是要求他們都在某個地方。 – CD001

+0

一個有趣的結果。 'bob'匹配一次,'sled'匹配一次,但'bug'不匹配。什麼是一個空白字符的添加? – mcl

+0

現在它應該工作正常 –