preg_match:字符串和第一个非字母数字字符之间

时间:2017-07-26 19:52:06

标签: php regex

我试图在给定字符串和第一个非字母数字字符之间提取文本。下面的代码有效但它使用标签而不是\ W.

$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);

1 个答案:

答案 0 :(得分:0)

Auth code:(.*)</div>模式匹配Auth code:文字子字符串,然后匹配并捕获除了换行符之外的任何0+字符的第1组,尽可能多的作为{ {1}}是一个贪婪的量词,然后匹配*,一个强制性的文字子字符串。

如果您将</div>替换为.*(懒惰版),您仍然无法获得所需的结果,因为.*?后面有一个空格,{{ 1}}匹配一个空格。因此,:将匹配\W和空格之间的空字符串。

获取所需子字符串的最佳方法是在.*?之后添加:(任意0+空格),然后使用匹配重置运算符 {{1}省略了到目前为止匹配的文本,并匹配1个或多个单词字符(它比任何字符懒得匹配到第一个非单词字符更有效):

\s*

<强>详情:

  • : - 文字子字符串
  • \K - 0+ whitespaces
  • ~Auth code:\s*\K\w+~ - 匹配重置运算符
  • Auth code: - 一个或多个单词字符

请参阅PHP demo online

\s*