2017-06-02 120 views
0

我試圖查看2個字符串是否匹配。匹配多個字符串

example: 1234.5678.9012.3456 => 5678.1234.3456 = match 

這匹配,因爲第二個數字串也在第一個。我做了以下代碼:

<?php 
$haystack = '1234.5678.9012.3456'; 
$needle = '5678.1234.3456'; 
$regex = '/(?=.*'. str_replace(".",")(?=.*",$needle) .').*$/'; 
    // regex looks like this /(?=.*5678)(?=.*1234)(?=.*3456).*$/ 

if(preg_match($regex, $haystack)){ 
    echo "A match was found."; 
} else { 
    echo "A match was not found."; 
} 
?> 

這是我的問題,當有重複的數字。

example: 1234.5678.9012.3456 => 5678.5678.3456 = dont match 
     1234.5678.5678.3456 => 5678.5678.3456 = match 

第一個示例不匹配,因爲5678發生兩次,但第一個字符串只有5678一次。在第二個例子中,5678出現兩次,因此匹配第二個字符串。

我的問題:我應該如何改變我的正則表達式,

+2

是不是'strpos'不夠嗎? –

+0

而不是使用正則表達式,使用'split()'將每個字符串拆分成一個字符串數組,然後使用'array_diff()'檢查第二個中的所有內容是否在第一個中。 –

回答

3

你選擇一個非常複雜的方式來做到這一點。你可以查看你想要什麼使用array_diff一個更簡單的方法:

var_dump(array_diff(explode('.', $needle), explode('.', $haystack))); 

時所產生的數組爲空的情況是真實的。

-1

試試這個:

<?php 
$haystack = '1234.5678.9012.3456'; 
$needle = '5678.5678.3456'; 

$needle_array = explode(".", $needle); 
//print_r($needle_array); 

$haystack_array = explode(".", $haystack); 
//print_r($haystack_array); 

$intersect = array_intersect($needle_array, $haystack_array); 
//print_r($intersect); 

if(count($intersect) > 0){ 
    echo "Match"; 
} else { 
    echo "Doesn't match"; 
} 
?> 
+0

交叉點不爲空的事實並不能證明針陣列的所有元素都在這個交集中。但是,不要計算交叉點中的元素數量,您可以將交點與針陣列進行比較。 –

+0

謝謝@CasimiretHippolyte。他想要這個:1234.5678.9012.3456 => 5678.5678.3456返回一個匹配。 – Josiah

+0

不,請再讀一遍問題的最後幾行。 –