PHP preg_match(.*)与过去的换行符不匹配
我在一个长文本列中有这些数据(因此保留换行符): 我试图匹配第1段到第3段。我正在使用以下代码:PHP preg_match(.*)与过去的换行符不匹配,php,preg-match,Php,Preg Match,我在一个长文本列中有这些数据(因此保留换行符): 我试图匹配第1段到第3段。我正在使用以下代码: preg_match('/Para(.*)three/', $row['file'], $m); 这不会返回任何结果。如果我试图在段落的第一行内工作,请匹配: preg_match('/Para(.*)one/', $row['file'], $m); 然后代码工作,我得到正确的字符串返回。我在这里做错了什么?添加 例如: 使用s修饰符 preg_match('/Para(.*)three/s'
preg_match('/Para(.*)three/', $row['file'], $m);
这不会返回任何结果。如果我试图在段落的第一行内工作,请匹配:
preg_match('/Para(.*)one/', $row['file'], $m);
然后代码工作,我得到正确的字符串返回。我在这里做错了什么?添加
例如:
使用
s
修饰符
preg_match('/Para(.*)three/s', $row['file'], $m);
尝试将正则表达式设置为dot all(末尾的额外“s”参数),使其包含换行符:
preg_match('/Para(.*)three/s', $row['file'], $m);
如果开始时不喜欢
/
,请使用
呵呵@塔苏文赢了我!Win的s修饰符对于任何想知道这与公认答案之间的差异的人(
s
修饰符),s
修饰符使
匹配换行符以及所有其他字符(默认情况下不包括它们),而m
控制^
和$
匹配的方式;强制它们只匹配整个字符串的开头和结尾(几乎-另请参见D
),而不是每行的开头和结尾。警告:/s
修饰符是贪婪的。如果文本中有多个“三”,则匹配将包括所有文本,直到最后一次出现为止。使用/sU
来防止这种情况(注意大写的U)。@FrankForte实际上不是一个修饰语问题:*
重复本身就是贪婪的。一个更好的方法是打一个问号让它变懒:/Para(.*)三个/s
。另外,/U
修饰符不会取消贪婪,而是将其反转:*
变为懒惰,*?
变为贪婪。在操作代码上不是问题,但它可以在更复杂的正则表达式中触发奇怪的错误。
preg_match('/Para(.*)three/s', $row['file'], $m);
preg_match('/Para(.*)three/s', $row['file'], $m);
$m = Pattern::of('Para(.*)three')->match($row['file'])->first();