2017-07-26 175 views
1

我試圖提取給定字符串和第一個非字母數字字符之間的文本。下面的代碼工作,但它使用標記而不是\ W。preg_match:字符串和第一個非字母數字字符

$my_string = 'Auth code: 02452A</div>'; 
preg_match("~Auth code:(.*)</div>~",$my_string, $m); 
print_r($m); 
// shouldn't this work, too? 
preg_match("~Auth code:(.*)\W~",$my_string, $m); 
+0

不您指明@Wiktor的副本。你可以添加g標誌:'preg_match(「〜Auth code:(。*)\ W〜g」,$ my_string,$ m);':參見https://stackoverflow.com/questions/12993629/g-flag-in-regular-expressions –

+0

@PierreGranger:好的,可能不是一個騙局。不過,它是PHP而不是JS。 'g'修飾符不被支持,爲了在PHP中獲得多個匹配,你需要使用'preg_match_all'。我認爲'preg_match(「〜Auth code:\ s *(。*?)\ W〜」,$ my_string,$ m);'會工作,但''〜驗證碼:\ s * \ K \ w +〜「 '好多了。請參閱[** IDEONE演示**](http://ideone.com/jVqRS5)。 –

+0

@PierreGranger好吧,preg_match_all全球 – Banditvibe

回答

0

Auth code:(.*)</div>模式匹配Auth code:文字串,然後匹配並捕捉到1個組中的任何0+比換行符字符,儘可能多*其它字符是一個貪婪量詞,然後匹配</div>,一個強制性的字面子串。

如果您要更換.*.*?(懶惰版本),你仍然不會得到你需要的,因爲有一個空間:後,和\W空間相匹配的結果。因此,.*?將匹配:和空格之間的空字符串。

得到你需要的子最好的辦法是:後添加\s*(任何0+空格),然後使用一個匹配復位操作\K省略了到目前爲止所匹配的文本,並搭配1個或多個字字符(這是效率遠高於匹配任何字符懶洋洋地達到第一個非字字符):

~Auth code:\s*\K\w+~ 

詳細

  • Auth code: - 文字串
  • \s* - 0+空格
  • \K - 匹配復位操作
  • \w+ - 1個或多個單詞字符

PHP demo online

$my_string = 'Auth code: 02452A</div>'; 
preg_match("~Auth code:\s*\K\w+~",$my_string, $m); 
print_r($m[0]); // => 02452A 
相關問題