记录一个由php正则引起的问题:
//有如下内容,需要正则匹配 Reviewer comments 后的内容,但是开始没有考虑到回车的问题,所以导致匹配内容为空的问题
$comments = '<strong>Reviewer recommendation:</strong> Revision<br/><strong>Reviewer comments:</strong> s revisions - there is some merit in this submission, but it fails to meet all the requirements for presenting it in this eve
55355345';
if (strpos($comments, 'Reviewer comments')) {
// preg_match('/<strong>Reviewer comments:<\/strong>\s*(.*?)$/', $comments, $matches);
preg_match('/<strong>Reviewer comments:<\/strong>\s*(.*?)$/s', $comments, $matches);
dd($matches);
}
(.*?)解释:
(.*?) 是一个非贪婪匹配组合,用于匹配任意字符,不包括换行符,但以最短的方式匹配。让我来解释一下它的各个部分:
( 和 ):这是捕获组,用于将匹配的内容捕获到一个单独的组中,以便稍后可以通过变量或数组引用。
.*?:这是一个非贪婪匹配的表达式,其中:
. 匹配任意字符(除了换行符)。
* 表示匹配前面的字符零次或多次。
? 表示非贪婪匹配,即以最短的方式匹配。
最短的方式:
意味着正则表达式引擎会尽可能地匹配最短的字符串
假如有这样的字符串: <p>Hello</p><p>World</p>
现在,我们使用正则表达式 /<p>.*?<\/p>/ 来匹配两个 <p> 标签之间的内容。
在这个正则表达式中,.*? 是一个非贪婪匹配,它将匹配任意字符(包括换行符),但以最短的方式匹配。所以,整个表达式将匹配两个 <p> 标签之间的最短内容,即:
<p>Hello</p>
<p>World</p>
如果我们使用贪婪匹配,即 /<p>.*<\/p>/,那么整个表达式将匹配两个 <p> 标签之间的最长内容,即:
<p>Hello</p><p>World</p>
注意表达式里的两个 s 的意义不同:
\s 是用来匹配空白字符的元字符。具体来说,\s 匹配空格、制表符、换行符等空白字符。
使用 /s 修饰符会改变 . 的行为,结尾的 /s 修饰符表示单行模式(single-line mode),使其匹配包括空白字符(whitespace)在内的任意字符。空白字符包括空格、制表符、换行符等。
具体来说,/s 修饰符会使得 . 匹配以下字符:
空格(space)
制表符(tab)
换行符(newline)
回车符(carriage return)
垂直制表符(vertical tab)
换页符(form feed)
所以,当你使用 /s 修饰符时,. 将匹配包括 <br> 标签中的换行符 \n 在内的任意字符。
同时,由于 $ 锚点匹配行尾,不包括换行符在内。如果不使用 /s 修饰符,$ 将匹配行尾而不是整个字符串的末尾,因此不会包括换行符,以及换行符之后的内容。
