php preg_replace求解
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;
abcdefgsdfsdafdfabcdffsafd';$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标签的正则,应该怎么写
abcdefgsdfsdafdfabcdffsafdabcdsfsdfdabcsdfsdfsdabc';$str = preg_replace('/(^(?:.*?)(abc)(?:.*?)|.*?)abc/im', '$1---', $str);echo $str;
---------- PHP run ----------
123456abcdefgsdfsdafdf---dffsafd---dsfsdfd---sdfsdfsd---
输出完成 (耗时 0 秒)
$str = '123456abcdefgsdf ssdfdabcdefgsdfsdafdfabcdffsafdabcdsfsdfdabcsdfsdfsdabc';$str = preg_replace('/(^(?:.*?)(abc)(?:.*?)|.*?)abc/im', '$1---', $str);echo $str;结果为123456abcdefgsdfssdfd---defgsdfsdafdf---dffsafd---dsfsdfd---sdfsdfsd---
第二个也被替换了,呃,我想要把没有加的过连接加上连接,加过的就不在处理了
功能用在关键字处理
//比如 导体为关键字,前面两个不能加了,没有加过的也只有加一个连接,也就是第三个导体$str = '';
//比如 导体为关键字,前面两个不能加了,没有加过的也只有加一个连接,也就是第三个 导体
$str = '
下次把需求描述清楚,要不怎么理解你的意思呢
(导体)(?!.*?)
关于这个正则的简单说明:
1、我的理解是只要后面不跟着一个闭合的标签,我就认为这个导体不在一个链接内
2、正则没有统一的格式,也就是没有一个能解决所有问题,要跟着需求走的
3、你也可以先符合“导体”的内容替换成 “导---------体”, 然后将所有的“导体”加上链接,接着最后将“导---------体”替换成“导体”,也一样可以得到目的
元半导体材料半导体制造厂,导体导体导体导体导体';$str = preg_replace('/(导体)(?!.*?)/imu', '$1', $str);echo $str;
元半导体材料半导体制造厂,导体导体导体导体导体半导体';$str = preg_replace('/(导体)([^)[^>]*>)/imu', '$1$2', $str);echo $str;
刚才没有考虑后面有链接的情况 已经修改了
你太强了,我想的是判断附近有没有a标签,没想到只要判断有没有标签就可以了,谢谢各位的回答,分不多,结了
纠结一大半天了
元半导体材料半导体制造厂,导体导体导体导体导体半导体';$str = preg_replace('/(导体)(?!(:?[^]*>)*)/imu', '$1', $str);echo $str;
。。。。。。这个才是
其实一直想问大家,preg_replace是不是不改变原来字符串的值,如果我想改变,该怎么做呢
上一篇: photoshop打造绚丽星云效果
下一篇: Linux tr命令的使用