如题,有一段文本
123456<a href="">abcdefg</a>sdfsdafdfabcdffsafd目标:将第二次出现的abc进行替换,第一次不做操作
菜鸟求解

解决方案 »

  1.   

    替换为什么?你确认这段文本中<a>和</a>只出现一次么?
      

  2.   


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

  3.   

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

  4.   


    这个不能替换后面更多个abc吧?我暂时没环境测万一不能,可以考虑preg_replace_callback
      

  5.   

    $str = '123456<a href="">abcdefg</a>abceeesdfsdafdfabcdffsafdabcdefg';$str = preg_replace('/(?<=..(?<![^a]>))abc/iU', '---', $str);echo $str,'<br>';只适用于有且仅有标签</a>
      

  6.   

    ↑↑结果为123456<a href="">abcdefg</a>---eeesdfsdafdf---dffsafd---defgecho <br>写多了,这里省略
      

  7.   

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

  8.   


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

  9.   

    <?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 秒)
      

  10.   


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

  11.   

    //比如 导体为关键字,前面两个不能加了,没有加过的也只有加一个连接,也就是第三个导体
    $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>';
      

  12.   


    下次把需求描述清楚,要不怎么理解你的意思呢(导体)(?!.*?<\/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;
      

  13.   

    <?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;
    刚才没有考虑后面有链接的情况 已经修改了
      

  14.   


    你太强了,我想的是判断附近有没有a标签,没想到只要判断有没有</a>标签就可以了,谢谢各位的回答,分不多,结了
    纠结一大半天了
      

  15.   

    <?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;
    这个才是
      

  16.   

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