带有PHP preg_匹配的多行字符串的正则表达式
我正在尝试为多行字符串构建一个模式,该模式必须以带有PHP preg_匹配的多行字符串的正则表达式,php,regex,preg-match,Php,Regex,Preg Match,我正在尝试为多行字符串构建一个模式,该模式必须以或?>+空格开始 我的尝试是/^\s?]\s?$/s,但没有成功。还尝试了消极前瞻-没有用 有什么想法吗? 提前感谢。您可以使用 (?s)^\s*<\?php(?!.*\?>\s*$).*+$ (?s)^\s*\s*$)*+$ 看 正则表达式解释: (?s)-为的整个模式启用单线模式以匹配换行符 ^-字符串的开头 \s*-可选空白,0或更多重复 空白 *+$-匹配,无需回溯到字符串结尾的任何字符 (如*+中所述)使我们能够一次性
或?>
+空格开始
我的尝试是/^\s?]\s?$/s
,但没有成功。还尝试了消极前瞻-没有用
有什么想法吗?
提前感谢。您可以使用
(?s)^\s*<\?php(?!.*\?>\s*$).*+$
(?s)^\s*\s*$)*+$
看
正则表达式解释:
(?s)
-为
的整个模式启用单线模式以匹配换行符
^
-字符串的开头
\s*
-可选空白,0或更多重复
空白
*+$
-匹配,无需回溯到字符串结尾的任何字符
(如*+
中所述)使我们能够一次性使用字符,并且永远不会回来搜索可能的排列
所有格量词是防止正则表达式引擎
尝试所有排列。这主要对性能有帮助
原因
我们不需要使用显式的SKIP-FAIL动词。在PHP中,您可以使用以下正则表达式:
'/^\s*<\?php(?:.(?!\?>\s*$))*$/s'
(*FAIL)
的行为类似于失败的否定断言,是(?!)
(*SKIP)
定义了一个点,在该点之后子模式失败时,不允许正则表达式引擎回溯该点
(*SKIP)(*FAIL)
一起提供了一个很好的限制替代方案,您不能在上述正则表达式中使用可变长度查找
我认为OP不希望以?>
或?>空白结束*
是的,它可以工作,尽管我不喜欢双重否定查找。不过老实说,我并没有否决你的答案,其他人也这么做了。@anubhava:现在应该是的,而且比2个lookbehinds+1好得多。如果你先trim()
字符串,这会变得容易得多,而且可以通过简单的str_pos
调用来完成。在我的情况下,这是不可能的。这里我只是准备模式,将它们传递给另一个脚本。
'/^\s*<\?php(?>.*\?>\s*$(*SKIP)(*F)|.*+$)/s'