带有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'