我想根据正则表达式匹配多行。假设我有以下字符串:
#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'。这个简单的任务使我难过。任何帮助将不胜感激。
答案 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()
preg_replace
将匹配所有 个出现,而不仅仅是第一个出现。但是,如果您只想匹配,而不是替换它们,则需要使用preg_match_all
而不是preg_match
,因为PHP不支持{{ 1}}标志,而具有/g
功能。
对于RegExr,您需要添加全局preg_match_all
标志以捕获多个匹配项,而不仅仅是第一个。
您的最终正则表达式应如下所示:
g