ホームページ  >  記事  >  バックエンド開発  >  php preg_replaceソリューション

php preg_replaceソリューション

WBOY
WBOYオリジナル
2016-06-23 14:05:00890ブラウズ

如题,有一段文本
1234566170e8999ab19ec641e0422470b16d5c abcdefg5db79b134e9f6b82c0b36e0489ee08edsdfsdafdf abcdffsafd

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


回复讨论(解决方案)

替换为什么?

你确认这段文本中3499910bf9dac5ae3c52d5ede7383485和5db79b134e9f6b82c0b36e0489ee08ed只出现一次么?

$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 ----------
1234566170e8999ab19ec641e0422470b16d5cabcdefg5db79b134e9f6b82c0b36e0489ee08edsdfsdafdf---dffsafd

PHP code



$str = '1234566170e8999ab19ec641e0422470b16d5cabcdefg5db79b134e9f6b82c0b36e0489ee08edsdfsdafdfabcdffsafd';

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

echo $str;





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

PHP code



$str = '1234566170e8999ab19ec641e0422470b16d5cabcdefg5db79b134e9f6b82c0b36e0489ee08edsdfsdafdfabcdffsafd';

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

echo $str;





---------- PHP run ----------
123456<……

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

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

如题,有一段文本
1234566170e8999ab19ec641e0422470b16d5cabcdefg5db79b134e9f6b82c0b36e0489ee08edsdfsdafdfabcdffsafd

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

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

嗯,我试试preg_replace_callback

$str = '1234566170e8999ab19ec641e0422470b16d5cabcdefg5db79b134e9f6b82c0b36e0489ee08edabceeesdfsdafdfabcdffsafdabcdefg';

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

echo $str,'0c6dc11e160d3b678d68754cc175188a';

只适用于 有且仅有标签5db79b134e9f6b82c0b36e0489ee08ed

↑↑结果为1234566170e8999ab19ec641e0422470b16d5cabcdefg5db79b134e9f6b82c0b36e0489ee08ed---eeesdfsdafdf---dffsafd---defg

echo 0c6dc11e160d3b678d68754cc175188a写多了,这里省略

如果是
$str = '1234566170e8999ab19ec641e0422470b16d5c这里还有其他字符abcdefg5db79b134e9f6b82c0b36e0489ee08edabceeesdfsdafdfabcdffsafdabcdefg';

那就很麻烦了

如果是
$str = '1234566170e8999ab19ec641e0422470b16d5c这里还有其他字符abcdefg5db79b134e9f6b82c0b36e0489ee08edabceeesdfsdafdfabcdffsafdabcdefg';

那就很麻烦了

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

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



---------- PHP run ----------
1234566170e8999ab19ec641e0422470b16d5cabcdefg5db79b134e9f6b82c0b36e0489ee08edsdfsdafdf---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 = 'e388a4556c0f65e1904146cc1a846bee元9a8f31affff0c8062cb2fd3bffc42252半 导体材料5db79b134e9f6b82c0b36e0489ee08ed9a8f31affff0c8062cb2fd3bffc42252半 导体5db79b134e9f6b82c0b36e0489ee08ed制造厂, 导体导体导体导体导体94b3e26ee717c64999d7867364b1b4a3';


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

(导体)(?!.*?5ce23afc5b373d775f30254cdc50b955)

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


<?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标签,没想到只要判断有没有5db79b134e9f6b82c0b36e0489ee08ed标签就可以了,谢谢各位的回答,分不多,结了
纠结一大半天了

<?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是不是不改变原来字符串的值,如果我想改变,该怎么做呢

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。