首页 > 解决方案 > 使用正则表达式匹配多行并使用正则表达式和 PHP 修改这些匹配的行

问题描述

我想根据正则表达式匹配多行。假设我有以下字符串:

#include<math.h>
#include<stdio.h>

int main()

我想#include<math.h><span class="header">#include<math.h> </span>#include<stdio.h>替换<span class="header">#include<stdio.h></span>。最终过滤的字符串将如下所示:

<span class="header">#include<math.h></span>
<span class="header">#include<stdio.h></span>

int main()

起初我试图匹配我的目标词以重新格式化如下:/#include<[^>]+>/m 但这仅选择第一行,以下适用于多行:/#include<[^>] +>/gm

现在我正在尝试准备这些匹配的行,如下所示:

 <span class="header">#include<math.h></span>
 <span class="header">#include<stdio.h></span>

代码:

  <?php 
    $input = '#include<math.h>
        #include<stdio.h> 
       int main()';
    $input = preg_replace('/(#include<[^>]+>)/gm','<span class="header">$0</span>',$input);

    echo $input;
    ?>

这段代码给出了一个错误,并且知道 'g' 不受 php 支持。这个简单的任务杀死了我的一天。任何帮助将不胜感激。

标签: phpregex

解决方案


这是针对您的问题的 PHP 解决方案:

$str = <<<EOF
#include<math.h>
#include<stdio.h>

int main()
EOF;
$str = preg_replace('/(#include<[^>]+>)/', '<span class="header">$1</span>', $str);
echo $str;

这输出:

<span class="header">#include<math.h></span>
<span class="header">#include<stdio.h></span>

int main()

3v41.org 演示

preg_replace将匹配所有出现,而不仅仅是第一个。但是,如果您只想匹配出现而不是替换它们,则需要使用preg_match_all而不是preg_match,因为 PHP 不支持该/g标志,而是具有此preg_match_all功能。


对于 RegExr,您需要添加全局g标志来捕获多个匹配项,而不仅仅是第一个。

您的最终正则表达式应如下所示:

/#include<[^>]+>/gm

正则表达式截图

正则表达式演示


推荐阅读