php preg_replace求解

ysj635 2011-04-22 09:11:22
如题,有一段文本
123456<a href="">abcdefg</a>sdfsdafdfabcdffsafd

目标:将第二次出现的abc进行替换,第一次不做操作
菜鸟求解
...全文
529 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
culcrave 2013-04-08
  • 打赏
  • 举报
回复
其实一直想问大家,preg_replace是不是不改变原来字符串的值,如果我想改变,该怎么做呢
lazyboy_wu 2011-04-22
  • 打赏
  • 举报
回复


<?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 秒)
ysj635 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 snmr_com 的回复:]

如果是
$str = '123456<a href="">这里还有其他字符abcdefg</a>abceeesdfsdafdfabcdffsafdabcdefg';

那就很麻烦了
[/Quote]

前面还真有其它的字符了,是不是可以匹配abc前后没有a标签的正则,应该怎么写
ImN1 2011-04-22
  • 打赏
  • 举报
回复
如果是
$str = '123456<a href="">这里还有其他字符abcdefg</a>abceeesdfsdafdfabcdffsafdabcdefg';

那就很麻烦了
ImN1 2011-04-22
  • 打赏
  • 举报
回复
↑↑结果为123456<a href="">abcdefg</a>---eeesdfsdafdf---dffsafd---defg

echo <br>写多了,这里省略
ImN1 2011-04-22
  • 打赏
  • 举报
回复
$str = '123456<a href="">abcdefg</a>abceeesdfsdafdfabcdffsafdabcdefg';

$str = preg_replace('/(?<=..(?<![^a]>))abc/iU', '---', $str);

echo $str,'<br>';

只适用于有且仅有标签</a>
ysj635 2011-04-22
  • 打赏
  • 举报
回复
嗯,我试试preg_replace_callback
ysj635 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 ysj635 的回复:]
如题,有一段文本
123456<a href="">abcdefg</a>sdfsdafdfabcdffsafd

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

你说的对,不只一次,正则老是晕,请详解
amani11 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hnxxwyq 的回复:]

PHP code


<?php

$str = '123456<a href="">abcdefg</a>sdfsdafdfabcdffsafd';

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

echo $str;





---------- PHP run ----------
123456<……
[/Quote]

这个不能替换后面更多个abc吧?

我暂时没环境测。。。万一不能,可以考虑preg_replace_callback
KylinBL 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hnxxwyq 的回复:]
PHP code


<?php

$str = '123456<a href="">abcdefg</a>sdfsdafdfabcdffsafd';

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

echo $str;





---------- PHP run ---------……
[/Quote]
正解,我写的老长,正则只要这点,很强大啊,看来要深入学习了。
lazyboy_wu 2011-04-22
  • 打赏
  • 举报
回复


<?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
静默飘闪 2011-04-22
  • 打赏
  • 举报
回复

$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;
ImN1 2011-04-22
  • 打赏
  • 举报
回复
替换为什么?

你确认这段文本中<a>和</a>只出现一次么?
lazyboy_wu 2011-04-22
  • 打赏
  • 举报
回复


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




。。。。。。这个才是
ysj635 2011-04-22
  • 打赏
  • 举报
回复

你太强了,我想的是判断附近有没有a标签,没想到只要判断有没有</a>标签就可以了,谢谢各位的回答,分不多,结了
纠结一大半天了
lazyboy_wu 2011-04-22
  • 打赏
  • 举报
回复


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




刚才没有考虑后面有链接的情况 已经修改了
lazyboy_wu 2011-04-22
  • 打赏
  • 举报
回复

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

(导体)(?!.*?<\/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;


ysj635 2011-04-22
  • 打赏
  • 举报
回复
//比如 导体为关键字,前面两个不能加了,没有加过的也只有加一个连接,也就是第三个导体
$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>';
ysj635 2011-04-22
  • 打赏
  • 举报
回复

$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>';

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧