我正在尝试为多行字符串构建一个模式,该模式必须以<?php
或whitespace
+ <?php
和 NOT 结尾{{} 1}}或?>
+ ?>
。
我的尝试是whitespace
,但它没有用。也尝试了否定的前瞻 - 没用。
有什么想法吗? 提前谢谢。
答案 0 :(得分:3)
您可以使用
(?s)^\s*<\?php(?!.*\?>\s*$).*+$
请参阅demo
正则表达式解释:
(?s)
- 为.
的整个模式启用单线模式以匹配换行符^
- 字符串开头\s*
- 可选空格,0或更多重复<\?php
- 文字<?php
(?!.*\?>\s*$)
- 前瞻检查字符串是否以?>whitespace
.*+$
- 匹配没有回溯字符串结尾的任何字符。 possessive quantifier(如.*+
中所示)使我们能够一次性消耗一次字符,并且永远不会回来寻找可能的排列。
占有量词是防止正则表达式引擎的一种方法 尝试所有排列。这主要用于提高性能 的原因。
然后我们不要使用明确的SKIP-FAIL动词。
答案 1 :(得分:2)
在PHP中,您可以使用此正则表达式:
'/^\s*<\?php(?:.(?!\?>\s*$))*$/s'
^\s*<\?php
在第一行匹配可选空格和文字<?php
。(?:.(?!\?>\s*$))*
将使用否定前瞻匹配任何0个或多个不以?>whitespace*
结尾的字符。更新:为了提高效率,此PCRE正则表达式的执行速度将比上一次快:
'/^\s*<\?php(?>.*\?>\s*$(*SKIP)(*F)|.*+$)/s'
(*FAIL)
表现得像一个失败的否定断言,是(?!)
(*SKIP)
定义了一个点,当子模式稍后失败时,不允许正则表达式引擎回溯(*SKIP)(*FAIL)
一起提供了一个很好的限制替代方案,在上面的正则表达式中你不能有一个可变长度的lookbehind。