PHP preg_match(.*)与以前的换行符不匹配

Nor*_*rse 24 php preg-match

我在LONGTEXT列中有这些数据(因此保留了换行符):

Paragraph one
Paragraph two
Paragraph three
Paragraph four
Run Code Online (Sandbox Code Playgroud)

我正在尝试匹配第1段到第3段.我正在使用此代码:

preg_match('/Para(.*)three/', $row['file'], $m);
Run Code Online (Sandbox Code Playgroud)

这什么都不返回.如果我尝试在段落的第一行内工作,请匹配:

preg_match('/Para(.*)one/', $row['file'], $m);
Run Code Online (Sandbox Code Playgroud)

然后代码工作,我得到正确的字符串返回.我在这做错了什么?

Tas*_*sta 53

使用s修饰符.

preg_match('/Para(.*)three/s', $row['file'], $m);
Run Code Online (Sandbox Code Playgroud)

http://php.net/manual/en/reference.pcre.pattern.modifiers.php

  • 警告:`/s` 修饰符是贪婪的。如果文本中超过一个“三”,则匹配将包括所有文本,直到最后一次出现。使用 `/sU` 来防止这种情况(注意大写的 U)。 (2认同)
  • @FrankForte并不是一个真正的修饰语问题:`*`重复本身就是贪婪的.更好的方法是设置一个问号使其变得懒惰:`/ Para(.*?)three/s`.另外,`/ U`修饰符不会取消贪婪,而是反转它:`*`变得懒惰而`*?`变得贪婪.OP代码不是问题,但它可以在更复杂的正则表达式中触发奇怪的错误. (2认同)

小智 11

添加多行修改器.

例如:

preg_match('/Para(.*)three/m', $row['file'], $m)
Run Code Online (Sandbox Code Playgroud)

  • 对于任何想知道这个和被接受的答案(`s`修饰符)之间的区别的人,`s`修饰符使`.`匹配换行符以及所有其他字符(默认情况下它排除它们),而`m`控制如何`^`和`$`匹配; 强制它们只匹配整个字符串的开头和结尾(几乎 - 也见'D`),而不是每行的开头和结尾. (9认同)