php - 使用正则表达式匹配多行并使用正则表达式和 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 支持。这个简单的任务杀死了我的一天。任何帮助将不胜感激。
解决方案
这是针对您的问题的 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 不支持该/g
标志,而是具有此preg_match_all
功能。
对于 RegExr,您需要添加全局g
标志来捕获多个匹配项,而不仅仅是第一个。
您的最终正则表达式应如下所示:
/#include<[^>]+>/gm
推荐阅读
- php - 在 RegistrationController 中创建用户之前的验证
- flutter - Flutter:为什么 image_picker 不打开我画廊中的照片?
- protocol-buffers - protobuffers 中的重复字段是否保持插入的顺序?
- python-3.x - Flask Blueprint 在 __init__ 文件中尝试在应用程序上注册蓝图时返回 NameError
- css - Angular 7 - innerHTML - 从 DB 渲染 HTML 标签
- php - 从 Woocommerce 订单退款电子邮件中删除下载部分
- javascript - 按钮无法通过javascript点击
- android - 将 Android Lottie 动画与滚动对齐
- javascript - 在输入焦点上打开数字版本的 Windows 10 触摸键盘
- powershell - 让powershell运行下载的程序