php preg_replace求解 如题,有一段文本123456<a href="">abcdefg</a>sdfsdafdfabcdffsafd目标:将第二次出现的abc进行替换,第一次不做操作菜鸟求解 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 替换为什么?你确认这段文本中<a>和</a>只出现一次么? $test = 'test test test1';$arr[0] = '/(test)/';$arr[1] = '/(yjq)/';$val[0] = 'yjq';$val[1] = 'test';$test1 = preg_replace($arr[0], $val[0], $test);$test1 = preg_replace($arr[1], $val[1], $test1,1);echo $test.':'.$test1; <?php $str = '123456<a href="">abcdefg</a>sdfsdafdfabcdffsafd';$str = preg_replace('/(abc)(.*?)\\1/im', '$1$2---', $str);echo $str;---------- PHP run ----------123456<a href="">abcdefg</a>sdfsdafdf---dffsafd 这个不能替换后面更多个abc吧?我暂时没环境测万一不能,可以考虑preg_replace_callback $str = '123456<a href="">abcdefg</a>abceeesdfsdafdfabcdffsafdabcdefg';$str = preg_replace('/(?<=..(?<![^a]>))abc/iU', '---', $str);echo $str,'<br>';只适用于有且仅有标签</a> ↑↑结果为123456<a href="">abcdefg</a>---eeesdfsdafdf---dffsafd---defgecho <br>写多了,这里省略 如果是$str = '123456<a href="">这里还有其他字符abcdefg</a>abceeesdfsdafdfabcdffsafdabcdefg';那就很麻烦了 前面还真有其它的字符了,是不是可以匹配abc前后没有a标签的正则,应该怎么写 <?php $str = '123456<a href="">abcdefg</a>sdfsdafdfabcdffsafdabcdsfsdfdabcsdfsdfsdabc';$str = preg_replace('/(^(?:.*?)(abc)(?:.*?)|.*?)abc/im', '$1---', $str);echo $str;---------- PHP run ----------123456<a href="">abcdefg</a>sdfsdafdf---dffsafd---dsfsdfd---sdfsdfsd---输出完成 (耗时 0 秒) $str = '123456<a href="">abcdefg</a><a href="">sdf ssdfdabcdefg</a>sdfsdafdfabcdffsafdabcdsfsdfdabcsdfsdfsdabc';$str = preg_replace('/(^(?:.*?)(abc)(?:.*?)|.*?)abc/im', '$1---', $str);echo $str;结果为123456<a href="">abcdefg</a><a href="">sdfssdfd---defg</a>sdfsdafdf---dffsafd---dsfsdfd---sdfsdfsd---第二个也被替换了,呃,我想要把没有加的过连接加上连接,加过的就不在处理了功能用在关键字处理//比如 导体为关键字,前面两个不能加了,没有加过的也只有加一个连接,也就是第三个导体$str = '<p>元<a target="_blank" href="http://www.trjcn.com/news/news--type-list/cid-21/industry_id-14.html">半导体材料</a><a target="_blank" href="http://www.trjcn.com/news/news--type-list/cid-21/industry_id-14.html">半导体</a>制造厂,导体导体导体导体导体</p>'; //比如 导体为关键字,前面两个不能加了,没有加过的也只有加一个连接,也就是第三个导体$str = '<p>元<a target="_blank" href="http://www.trjcn.com/news/news--type-list/cid-21/industry_id-14.html">半导体材料</a><a target="_blank" href="http://www.trjcn.com/news/news--type-list/cid-21/industry_id-14.html">半导体</a>制造厂,导体导体导体导体导体</p>'; 下次把需求描述清楚,要不怎么理解你的意思呢(导体)(?!.*?<\/a>)关于这个正则的简单说明:1、我的理解是只要后面不跟着一个</a>闭合的标签,我就认为这个导体不在一个链接内2、正则没有统一的格式,也就是没有一个能解决所有问题,要跟着需求走的3、你也可以先符合“<a>导体</a>”的内容替换成 “<a>导---------体<a/>”, 然后将所有的“导体”加上链接,接着最后将“<a>导---------体<a/>”替换成“<a>导体</a>”,也一样可以得到目的<?php $str = '<p>元<a target="_blank" href="http://www.trjcn.com/news/news--type-list/cid-21/industry_id-14.html">半导体材料</a><a target="_blank" href="http://www.trjcn.com/news/news--type-list/cid-21/industry_id-14.html">半导体</a>制造厂,导体导体导体导体导体</p>';$str = preg_replace('/(导体)(?!.*?<\/a>)/imu', '<a>$1</a>', $str);echo $str; <?php $str = '<p>元<a target="_blank" href="http://www.trjcn.com/news/news--type-list/cid-21/industry_id-14.html">半导体材料</a><a target="_blank" href="http://www.trjcn.com/news/news--type-list/cid-21/industry_id-14.html">半导体</a>制造厂,导体导体导体导体导体<a target="_blank" href="http://www.trjcn.com/news/news--type-list/cid-21/industry_id-14.html">半导体</a></p>';$str = preg_replace('/(导体)([^<]|<(?!\/a>)[^>]*>)/imu', '<a>$1</a>$2', $str);echo $str;刚才没有考虑后面有链接的情况 已经修改了 你太强了,我想的是判断附近有没有a标签,没想到只要判断有没有</a>标签就可以了,谢谢各位的回答,分不多,结了纠结一大半天了 <?php $str = '<p>元<a target="_blank" href="http://www.trjcn.com/news/news--type-list/cid-21/industry_id-14.html">半导体材料</a><a target="_blank" href="http://www.trjcn.com/news/news--type-list/cid-21/industry_id-14.html">半导体</a>制造厂,导体导体导体导体导体<a target="_blank" href="http://www.trjcn.com/news/news--type-list/cid-21/industry_id-14.html">半导体</a></p>';$str = preg_replace('/(导体)(?!(:?[^<]|<(?!a)[^>]*>)*<\/a>)/imu', '<a>$1</a>', $str);echo $str;这个才是 其实一直想问大家,preg_replace是不是不改变原来字符串的值,如果我想改变,该怎么做呢 php的大师们,谢谢啦 急救啊 Cookie 有同情心的。。 求一个正则表达式 看看我的inlucude_path怎么不起作用? PHP上传文件问题. 下载队列怎样实现 关于生成静态页面的问题 请问谁有实现邮箱左侧树状结构显示的源码或者设计思想?(像eyou,163那样的)急用!在线等待 php文件上传 急急急急!!php连接mysql问题
$test = 'test test test1';
$arr[0] = '/(test)/';
$arr[1] = '/(yjq)/';
$val[0] = 'yjq';
$val[1] = 'test';
$test1 = preg_replace($arr[0], $val[0], $test);
$test1 = preg_replace($arr[1], $val[1], $test1,1);
echo $test.':'.$test1;
---------- PHP run ----------
123456<a href="">abcdefg</a>sdfsdafdf---dffsafd
这个不能替换后面更多个abc吧?我暂时没环境测万一不能,可以考虑preg_replace_callback
$str = '123456<a href="">这里还有其他字符abcdefg</a>abceeesdfsdafdfabcdffsafdabcdefg';那就很麻烦了
前面还真有其它的字符了,是不是可以匹配abc前后没有a标签的正则,应该怎么写
---------- PHP run ----------
123456<a href="">abcdefg</a>sdfsdafdf---dffsafd---dsfsdfd---sdfsdfsd---
输出完成 (耗时 0 秒)
$str = '123456<a href="">abcdefg</a><a href="">sdf ssdfdabcdefg</a>sdfsdafdfabcdffsafdabcdsfsdfdabcsdfsdfsdabc';$str = preg_replace('/(^(?:.*?)(abc)(?:.*?)|.*?)abc/im', '$1---', $str);echo $str;结果为123456<a href="">abcdefg</a><a href="">sdfssdfd---defg</a>sdfsdafdf---dffsafd---dsfsdfd---sdfsdfsd---
第二个也被替换了,呃,我想要把没有加的过连接加上连接,加过的就不在处理了
功能用在关键字处理
//比如 导体为关键字,前面两个不能加了,没有加过的也只有加一个连接,也就是第三个导体
$str = '<p>元<a target="_blank" href="http://www.trjcn.com/news/news--type-list/cid-21/industry_id-14.html">半导体材料</a><a target="_blank" href="http://www.trjcn.com/news/news--type-list/cid-21/industry_id-14.html">半导体</a>制造厂,导体导体导体导体导体</p>';
$str = '<p>元<a target="_blank" href="http://www.trjcn.com/news/news--type-list/cid-21/industry_id-14.html">半导体材料</a><a target="_blank" href="http://www.trjcn.com/news/news--type-list/cid-21/industry_id-14.html">半导体</a>制造厂,导体导体导体导体导体</p>';
下次把需求描述清楚,要不怎么理解你的意思呢(导体)(?!.*?<\/a>)关于这个正则的简单说明:
1、我的理解是只要后面不跟着一个</a>闭合的标签,我就认为这个导体不在一个链接内
2、正则没有统一的格式,也就是没有一个能解决所有问题,要跟着需求走的
3、你也可以先符合“<a>导体</a>”的内容替换成 “<a>导---------体<a/>”, 然后将所有的“导体”加上链接,接着最后将“<a>导---------体<a/>”替换成“<a>导体</a>”,也一样可以得到目的
<?php $str = '<p>元<a target="_blank" href="http://www.trjcn.com/news/news--type-list/cid-21/industry_id-14.html">半导体材料</a><a target="_blank" href="http://www.trjcn.com/news/news--type-list/cid-21/industry_id-14.html">半导体</a>制造厂,导体导体导体导体导体</p>';
$str = preg_replace('/(导体)(?!.*?<\/a>)/imu', '<a>$1</a>', $str);echo $str;
$str = preg_replace('/(导体)([^<]|<(?!\/a>)[^>]*>)/imu', '<a>$1</a>$2', $str);echo $str;
刚才没有考虑后面有链接的情况 已经修改了
你太强了,我想的是判断附近有没有a标签,没想到只要判断有没有</a>标签就可以了,谢谢各位的回答,分不多,结了
纠结一大半天了
$str = preg_replace('/(导体)(?!(:?[^<]|<(?!a)[^>]*>)*<\/a>)/imu', '<a>$1</a>', $str);echo $str;
这个才是