使用正则表达式匹配多行,并使用regexp和PHP修改这些匹配的行

时间:2018-11-26 02:03:16

标签: php regex

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

#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;
    ?>

此代码给出了一个错误,并且知道PHP不支持'g'。这个简单的任务使我难过。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

以下是您问题的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 demo

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


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

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

g

RegExr screenshot

RegExr demo