使用PHP preg_match的多行字符串的正则表达式

时间:2015-06-11 20:40:03

标签: php regex preg-match

我正在尝试为多行字符串构建一个模式,该模式必须以<?phpwhitespace + <?php NOT 结尾{{} 1}}或?> + ?>

我的尝试是whitespace,但它没有用。也尝试了否定的前瞻 - 没用。

有什么想法吗? 提前谢谢。

2 个答案:

答案 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'

RegEx Demo

  • ^\s*<\?php在第一行匹配可选空格和文字<?php
  • (?:.(?!\?>\s*$))*将使用否定前瞻匹配任何0个或多个不以?>whitespace*结尾的字符。

更新:为了提高效率,此PCRE正则表达式的执行速度将比上一次快:

'/^\s*<\?php(?>.*\?>\s*$(*SKIP)(*F)|.*+$)/s'

RegEx Demo 2

  • (*FAIL)表现得像一个失败的否定断言,是(?!)
  • 的同义词
  • (*SKIP)定义了一个点,当子模式稍后失败时,不允许正则表达式引擎回溯
  • (*SKIP)(*FAIL)一起提供了一个很好的限制替代方案,在上面的正则表达式中你不能有一个可变长度的lookbehind。