preg_match:字符串和第一个非字母数字字符
问题描述:
我试图提取给定字符串和第一个非字母数字字符之间的文本。下面的代码工作,但它使用标记而不是\ 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);
答
的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个或多个单词字符
$my_string = 'Auth code: 02452A</div>';
preg_match("~Auth code:\s*\K\w+~",$my_string, $m);
print_r($m[0]); // => 02452A
不您指明@Wiktor的副本。你可以添加g标志:'preg_match(“〜Auth code:(。*)\ W〜g”,$ my_string,$ m);':参见https://stackoverflow.com/questions/12993629/g-flag-in-regular-expressions –
@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)。 –
@PierreGranger好吧,preg_match_all全球 – Banditvibe