php preg_replace求解

php中文网
发布: 2016-06-23 14:05:00
原创
1072人浏览过

如题,有一段文本
123456 abcdefgsdfsdafdf abcdffsafd

目标:将第二次出现的abc进行替换,第一次不做操作
菜鸟求解


回复讨论(解决方案)

替换为什么?

你确认这段文本中只出现一次么?

$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 ----------
123456abcdefgsdfsdafdf---dffsafd

PHP code



$str = '123456abcdefgsdfsdafdfabcdffsafd';

$str = preg_replace('/(abc)(.*?)\1/im', '$1$2---', $str);

echo $str;





---------- PHP run ---------……
正解,我写的老长,正则只要这点,很强大啊,看来要深入学习了。

PHP code



$str = '123456abcdefgsdfsdafdfabcdffsafd';

$str = preg_replace('/(abc)(.*?)\1/im', '$1$2---', $str);

echo $str;





---------- PHP run ----------
123456
这个不能替换后面更多个abc吧?

我暂时没环境测。。。万一不能,可以考虑preg_replace_callback

如题,有一段文本
123456abcdefgsdfsdafdfabcdffsafd

目标:将第二次出现的abc进行替换,第一次不做操作
菜鸟求解

你说的对,不只一次,正则老是晕,请详解

嗯,我试试preg_replace_callback

$str = '123456abcdefgabceeesdfsdafdfabcdffsafdabcdefg';

$str = preg_replace('/(?))abc/iU', '---', $str);

echo $str,'
';

只适用于 有且仅有标签

↑↑结果为123456abcdefg---eeesdfsdafdf---dffsafd---defg

echo 
写多了,这里省略

如果是
$str = '123456这里还有其他字符abcdefgabceeesdfsdafdfabcdffsafdabcdefg';

那就很麻烦了

如果是
$str = '123456这里还有其他字符abcdefgabceeesdfsdafdfabcdffsafdabcdefg';

那就很麻烦了

前面还真有其它的字符了,是不是可以匹配 abc前后没有a标签的正则,应该怎么写

<?php    $str = '123456<a href="">abcdefg</a>sdfsdafdfabcdffsafdabcdsfsdfdabcsdfsdfsdabc';$str = preg_replace('/(^(?:.*?)(abc)(?:.*?)|.*?)abc/im', '$1---', $str);echo $str;
登录后复制



---------- PHP run ----------
123456abcdefgsdfsdafdf---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 = '

半 导体材料半 导体制造厂, 导体导体导体导体导体

';


下次把需求描述清楚,要不怎么理解你的意思呢

(导体)(?!.*?)

关于这个正则的简单说明:
1、我的理解是只要后面不跟着一个闭合的标签,我就认为这个导体不在一个链接内
2、正则没有统一的格式,也就是没有一个能解决所有问题,要跟着需求走的
3、你也可以先符合“导体”的内容替换成 “导---------体”, 然后将所有的“导体”加上链接,接着最后将“导---------体”替换成“导体”,也一样可以得到目的


<?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>
                    <div class="aritcle_card">
                        <a class="aritcle_card_img" href="/xiazai/js/5805">
                            <img src="https://img.php.cn/upload/jscode/000/120/096/5e141a807a7f1326.jpg" alt="PHP多文件上传插件">
                        </a>
                        <div class="aritcle_card_info">
                            <a href="/xiazai/js/5805">PHP多文件上传插件</a>
                            <p>PHP多文件上传插件</p>
                            <div class="">
                                <img src="/static/images/card_xiazai.png" alt="PHP多文件上传插件">
                                <span>149</span>
                            </div>
                        </div>
                        <a href="/xiazai/js/5805" class="aritcle_card_btn">
                            <span>查看详情</span>
                            <img src="/static/images/cardxiayige-3.png" alt="PHP多文件上传插件">
                        </a>
                    </div>
                <p><span>立即学习</span>“<a href="https://pan.quark.cn/s/7fc7563c4182" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">PHP免费学习笔记(深入)</a>”;</p>';$str = preg_replace('/(导体)([^<]|<(?!/a>)[^>]*>)/imu', '<a>$1</a>$2', $str);echo $str;
登录后复制


刚才没有考虑后面有链接的情况 已经修改了


你太强了,我想的是判断附近有没有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><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/7fc7563c4182" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">PHP免费学习笔记(深入)</a>”;</p>';$str = preg_replace('/(导体)(?!(:?[^<]|<(?!a)[^>]*>)*</a>)/imu', '<a>$1</a>', $str);echo $str;
登录后复制


。。。。。。这个才是

其实一直想问大家,preg_replace是不是不改变原来字符串的值,如果我想改变,该怎么做呢

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号