正则表达式匹配不是单行并扩展到多行的结果

Regex to match a result that isn't single line and expanded across multiple lines

我想更改 /<\?php\s([\s\S]*?)\?>/gi 排除单行 PHP 标签的方式。

例如,这里我只想匹配第二个 PHP 标签而不是第一个:

Test number <?PHP echo($a);?> is here.

This is test number <?PHP echo($b);
$b = $a?> that expanded across multiple lines.

您可以使用

<\?php(?!\S)((?:(?!<\?php(?!\S)|\?>).)*\R[\s\S]*?)\?>

多行变体 .:

<\?php\s((?:(?!<\?php\s|\?>).)*\R(?s:.*?))\?>

regex demo详情:

  • <\?php - <?php 子串
  • (?!\S) - right-hand 空白边界(紧靠右边,必须有空白或字符串开头)
  • ((?:(?!<\?php(?!\S)|\?>).)*\R[\s\S]*?) - 第 1 组:
    • (?:(?!<\?php(?!\S)|\?>).)* - 除换行符字符外的任何单个字符,零个或多个字符,出现次数尽可能多,不会开始 <?php + a right-hand whitespace boundary or ?>` 字符序列
    • \R - 换行序列
    • [\s\S]*? / (?s:.*?) - 尽可能少的任何零个或多个字符
  • \?> - ?> 子串。