2017-07-26 176 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 
相关问题