2016-04-21 52 views
0

考慮我有這樣如何獲得在PHP中使用通配符搜索

"i dont know what i am doing abcd SDDDFDFDF fff ggg eee some texts......." 

這是一個字符串的位置(strpos)是我想作爲外卡abcd %SOMEWILDCARD% fff ggg eee

即在這裏,我需要得到a的位置abcd即位置28

在谷歌上搜索了很多,我發現這個的fnmatch用於匹配或在PHP做通配符搜索,但沒有聯繫我能找到我所期待的......

這裏是我試過了,我知道這聽起來很愚蠢

echo strpos ($strmatch, fnmatch('abcd /*/ fff ggg eee', $strmatch)); 

如預期的那樣,它什麼都沒有返回。

+0

這聽起來像是一個正則表達式的工作,但我不喜歡正則表達式,所以也許有人會看到你的問題,並能夠幫助你。 – MonkeyZeus

+1

我很困惑,你的通配符和'abcd'之間有什麼關係?你究竟在努力實現什麼? 'abcd'總是會一樣嗎?爲什麼你不能使用'strpos'搜索abcd? –

回答

1

preg_match支持PREG_OFFSET_CAPTURE標誌,這將給你找到字符串的位置。 preg_match documentation狀態

PREG_OFFSET_CAPTURE

如果該標誌,對每個出現的匹配結果附屬的字符串偏移也將被退回。注意這改變匹配的值到一個數組,每一個元素是一個數組由匹配字符串中的偏移量爲0和它的字符串偏移量在受試者偏移1.

短例如:

$str = "i dont know what i am doing abcd SDDDFDFDF fff ggg eee some texts......."; 
preg_match("~abcd\s+.*?\s+fff~", $str, $matches, PREG_OFFSET_CAPTURE); 
$position = $matches[0][1]; 

要解釋正則表達式,我使用波浪號()作爲標記RegExp開始和結束的分隔符。正則表達式的意思是,匹配abcd後跟一個到無限空格字符(空格,製表符等),後面是任何內容,匹配非貪婪到下一個到無限空格字符,然後是fff

現在,$matches是一個嵌套數組,其中第一個元素是整個匹配的數組,第一個子元素是匹配的字符串,第二個元素是找到的字符串的起始位置。

1

也許是這樣的:

$string = "i dont know what i am doing abcd SDDDFDFDF fff ggg eee some texts......."; 
$sub_string = "abcd"; 
$sub_sub_string = "a"; 

$first_pos = strpos($string, $sub_string); 
$last_pos = $first_pos + strpos($sub_string, $sub_sub_string); 

echo $last_pos;