感谢@jam00 在http://bbs.csdn.net/topics/391942653?page=1#post-401087159中的回答。按照大神的思路,如果是下面的情况该怎么办呢?function keywords_autolink($content) {
    $keywords=array(
            '企业管理书籍' => '<a target="_blank" title="企业管理书籍" href="http://www.12reads.cn/">企业管理书籍</a>',
            '管理学书籍' => '<a target="_blank" title="管理学书籍" href="http://www.12reads.cn/">管理学书籍</a>',
            '管理书籍' => '<a target="_blank" title="管理书籍" href="http://www.12reads.cn/">管理书籍</a>',
            '管理类书籍' => '<a target="_blank" title="管理类书籍" href="http://www.12reads.cn/">管理类书籍</a>',
            '市场营销' => '<a target="_blank" title="市场营销" href="http://www.12reads.cn/category/eting">市场营销</a>',
            '职场' => '<a target="_blank" title="职场" href="http://www.12reads.cn/category/career">职场</a>'
 ); 
   //关键词部分
   $keys=array_keys($keywords);
    foreach ($keys as $k) {
      $pos=strpos($content, $k);
      if ($pos !== false) {
        // Nothing found
        $length=strlen($k);
        $content=substr_replace($content, $keywords[$k], $pos, $length);
        //$content是文章内容,$keywords[$k]需要替换成的内容,$pos替换开始的位置,$length数出要从开始的位置算起要替换的词有多长。
        unset($k);//最后销毁一下哦。    }
    } 
//标签部分
$tags = get_tags();
foreach ($tags as $key){
$name= $key->name;//取出所有标签名称
$tag_link = get_tag_link($key->term_id);//取出标签链接
$replacement="<a target='_blank' title='{$key->name}' href='{$tag_link}'>{$key->name}</a>";
$pos=strpos($content, $name);
      if ($pos !== false) {
        $length=strlen($name);
        //从标签开始出现的位置按照其字符长度开始替换,因此结果是只替换一次。
        $content=substr_replace($content, $replacement, $pos, $length);
        unset($key);//最后销毁一下哦。
    }
 }
       
  return $content;
  
}
add_filter('the_content', 'keywords_autolink');比原来的多一部分,这种情况和http://bbs.csdn.net/topics/391942653一模一样,比如有个标签叫“企业管理”,那么当文章中出现了“企业管理书籍”,就会被替换两次先替换企业管理书籍然后再替换企业管理,这样HTML乱了套,变成下面这样:<a href="http://www.12reads.cn/" title="<a target='_blank' title='企业管理' href='http://v:8888/tag/%e4%bc%81%e4%b8%9a%e7%ae%a1%e7%90%86'>企业管理</a>书籍" target="_blank">企业管理书籍</a>

解决方案 »

  1.   

    你那见得的匹配是不行的$s =<<< TXT
    企业管理书籍企业管理管理学书籍管理书籍管理类书籍市场营销职场
    企业管理书籍企业管理管理学书籍管理书籍管理类书籍市场营销职场TXT;
    $k = array(
      '企业管理书籍' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '企业管理' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '管理学书籍' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '管理书籍' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '管理类书籍' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '市场营销' => '<a target="_blank" title="%s" href="http://www.12reads.cn/category/eting">%s</a>',
      '职场' => '<a target="_blank" title="%s" href="http://www.12reads.cn/category/career">%s</a>'
    ); $charset = mb_check_encoding($s, 'utf-8') ? 'utf-8' : 'gbk';
    mb_internal_encoding($charset);$d = array_keys($k);
    $t = '';
    $r = '';
    $p = array();
    for($i=0; $i<mb_strlen($s); $i++) {
      $c = mb_substr($s, $i, 1);
      if(preg_grep('/' . $t . $c . '/', $d)) {
        $t .= $c;
        continue;
      }
      if(isset($k[$t])){
        if(! in_array($t, $p)) {
          $p[] = $t;
          $t = sprintf($k[$t], $t, $t);
        }
      }
      $r .= $t;
      $t = $c;
    }
    echo $r;
    <a target="_blank" title="企业管理书籍" href="http://www.12reads.cn/">企业管理书籍</a><a target="_blank" title="企业管理" href="http://www.12reads.cn/">企业管理</a><a target="_blank" title="管理学书籍" href="http://www.12reads.cn/">管理学书籍</a><a target="_blank" title="管理书籍" href="http://www.12reads.cn/">管理书籍</a><a target="_blank" title="管理类书籍" href="http://www.12reads.cn/">管理类书籍</a><a target="_blank" title="市场营销" href="http://www.12reads.cn/category/eting">市场营销</a><a target="_blank" title="职场" href="http://www.12reads.cn/category/career">职场</a>
    企业管理书籍企业管理管理学书籍管理书籍管理类书籍市场营销职场
      

  2.   


    整合到一起后是这样吗:add_filter('the_content', 'keywords_autolink');
    function keywords_autolink($content) {
        $s =<<< TXT
    企业管理书籍企业管理管理学书籍管理书籍管理类书籍市场营销职场
    企业管理书籍企业管理管理学书籍管理书籍管理类书籍市场营销职场
     
    TXT;
    $k = array(
      '企业管理书籍' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '企业管理' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '管理学书籍' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '管理书籍' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '管理类书籍' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '市场营销' => '<a target="_blank" title="%s" href="http://www.12reads.cn/category/eting">%s</a>',
      '职场' => '<a target="_blank" title="%s" href="http://www.12reads.cn/category/career">%s</a>'
    ); 
     
    $charset = mb_check_encoding($s, 'utf-8') ? 'utf-8' : 'gbk';
    mb_internal_encoding($charset);
     
    $d = array_keys($k);
    $t = '';
    $r = '';
    $p = array();
    for($i=0; $i<mb_strlen($s); $i++) {
      $c = mb_substr($s, $i, 1);
      if(preg_grep('/' . $t . $c . '/', $d)) {
        $t .= $c;
        continue;
      }
      if(isset($k[$t])){
        if(! in_array($t, $p)) {
          $p[] = $t;
          $t = sprintf($k[$t], $t, $t);
        }
      }
      $r .= $t;
      $t = $c;
    }
    //标签部分
    $tags = get_tags();
    foreach ($tags as $key){
    $name= $key->name;//取出所有标签名称
    $tag_link = get_tag_link($key->term_id);//取出标签链接
    $replacement="<a target='_blank' title='{$key->name}' href='{$tag_link}'>{$key->name}</a>";
    $pos=strpos($content, $name);
          if ($pos !== false) {
            $length=strlen($name);
            //从标签开始出现的位置按照其字符长度开始替换,因此结果是只替换一次。
            $content=substr_replace($content, $replacement, $pos, $length);
            unset($key);//最后销毁一下哦。
        }
     }
           
      return $content;
      
    }这样只有标签部分被替换了,上面的关键词部分没反应。我原来那个都可以替换,只是当关键词包含标签时会重复替换。谢谢。
      

  3.   

    函数传入的参数($content)就是我代码中的 $s
      

  4.   

    不行,提示这行  if(preg_grep('/' . $t . $c . '/', $d)) {
    有错:Warning: preg_grep(): Unknown modifier '/' in /Users/Anthony/Desktop/localhost/wp-content/themes/dt-the7/functions.php on line 576
      

  5.   

    这很正常,由于你的正文里什么字符都可能出现
    作为规则时是要转义的
    preg_grep('/' . preg_quote($t . $c) . '/', $d)
      

  6.   

    Warning 不会中断程序的运行,你可以观察出错时的值
      

  7.   


    嗯满屏WARNING没看到下面,现在看到了,但仍然只是替换了标签部分呢。
      

  8.   

    add_filter('the_content', 'keywords_autolink');
    function keywords_autolink($content) {
        $s =<<< TXT
    企业管理书籍企业管理管理学书籍管理书籍管理类书籍市场营销职场
    企业管理书籍企业管理管理学书籍管理书籍管理类书籍市场营销职场
     
    TXT;
    $k = array(
      '企业管理书籍' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '企业管理' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '管理学书籍' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '管理书籍' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '管理类书籍' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '市场营销' => '<a target="_blank" title="%s" href="http://www.12reads.cn/category/eting">%s</a>',
      '职场' => '<a target="_blank" title="%s" href="http://www.12reads.cn/category/career">%s</a>'
    ); 
     
    $charset = mb_check_encoding($content, 'utf-8') ? 'utf-8' : 'gbk';
    mb_internal_encoding($charset);
     
    $d = array_keys($k);
    $t = '';
    $r = '';
    $p = array();
    for($i=0; $i<mb_strlen($content); $i++) {
      $c = mb_substr($content, $i, 1);
      if(preg_grep('/' . preg_quote($t . $c) . '/', $d)) {
        $t .= $c;
        continue;
      }
      if(isset($k[$t])){
        if(! in_array($t, $p)) {
          $p[] = $t;
          $t = sprintf($k[$t], $t, $t);
        }
      }
      $r .= $t;
      $t = $c;
    }
    //标签部分
    $tags = get_tags();
    foreach ($tags as $key){
    $name= $key->name;//取出所有标签名称
    $tag_link = get_tag_link($key->term_id);//取出标签链接
    $replacement="<a target='_blank' title='{$key->name}' href='{$tag_link}'>{$key->name}</a>";
    $pos=strpos($content, $name);
          if ($pos !== false) {
            $length=strlen($name);
            //从标签开始出现的位置按照其字符长度开始替换,因此结果是只替换一次。
            $content=substr_replace($content, $replacement, $pos, $length);
            unset($key);//最后销毁一下哦。
        }
     }
           
      return $content;
      
    }用不了汗,只替换了标签没有替换关键词。
      

  9.   

    $a = [1,2,3];
    for($i=0; $i<256; $i++) {
      echo "\n$i ";
      print_r(preg_grep('/' . preg_quote(chr($i)) . '/', $a));
    }
    0 Array
    (
    )1 Array
    (
    )2 Array
    (
    )3 Array
    (
    )4 Array
    (
    )5 Array
    (
    )6 Array
    (
    )7 Array
    (
    )8 Array
    (
    )9 Array
    (
    )10 Array
    (
    )11 Array
    (
    )12 Array
    (
    )13 Array
    (
    )14 Array
    (
    )15 Array
    (
    )16 Array
    (
    )17 Array
    (
    )18 Array
    (
    )19 Array
    (
    )20 Array
    (
    )21 Array
    (
    )22 Array
    (
    )23 Array
    (
    )24 Array
    (
    )25 Array
    (
    )26 Array
    (
    )27 Array
    (
    )28 Array
    (
    )29 Array
    (
    )30 Array
    (
    )31 Array
    (
    )32 Array
    (
    )33 Array
    (
    )34 Array
    (
    )35 Array
    (
    )36 Array
    (
    )37 Array
    (
    )38 Array
    (
    )39 Array
    (
    )40 Array
    (
    )41 Array
    (
    )42 Array
    (
    )43 Array
    (
    )44 Array
    (
    )45 Array
    (
    )46 Array
    (
    )47 <br />
    <b>Warning</b>:  preg_grep(): Unknown modifier '/' in <b>D:\AMP\web\ide_tmp.php</b> on line <b>6</b><br />48 Array
    (
    )49 Array
    (
        [0] => 1
    )50 Array
    (
        [1] => 2
    )51 Array
    (
        [2] => 3
    )52 Array
    (
    )53 Array
    (
    )54 Array
    (
    )55 Array
    (
    )56 Array
    (
    )57 Array
    (
    )58 Array
    (
    )59 Array
    (
    )60 Array
    (
    )61 Array
    (
    )62 Array
    (
    )63 Array
    (
    )64 Array
    (
    )65 Array
    (
    )66 Array
    (
    )67 Array
    (
    )68 Array
    (
    )69 Array
    (
    )70 Array
    (
    )71 Array
    (
    )72 Array
    (
    )73 Array
    (
    )74 Array
    (
    )75 Array
    (
    )76 Array
    (
    )77 Array
    (
    )78 Array
    (
    )79 Array
    (
    )80 Array
    (
    )81 Array
    (
    )82 Array
    (
    )83 Array
    (
    )84 Array
    (
    )85 Array
    (
    )86 Array
    (
    )87 Array
    (
    )88 Array
    (
    )89 Array
    (
    )90 Array
    (
    )91 Array
    (
    )92 Array
    (
    )93 Array
    (
    )94 Array
    (
    )95 Array
    (
    )96 Array
    (
    )97 Array
    (
    )98 Array
    (
    )99 Array
    (
    )100 Array
    (
    )101 Array
    (
    )102 Array
    (
    )103 Array
    (
    )104 Array
    (
    )105 Array
    (
    )106 Array
    (
    )107 Array
    (
    )108 Array
    (
    )109 Array
    (
    )110 Array
    (
    )111 Array
    (
    )112 Array
    (
    )113 Array
    (
    )114 Array
    (
    )115 Array
    (
    )116 Array
    (
    )117 Array
    (
    )118 Array
    (
    )119 Array
    (
    )120 Array
    (
    )121 Array
    (
    )122 Array
    (
    )123 Array
    (
    )124 Array
    (
    )125 Array
    (
    )126 Array
    (
    )127 Array
    (
    )128 Array
    (
    )129 Array
    (
    )130 Array
    (
    )131 Array
    (
    )132 Array
    (
    )133 Array
    (
    )134 Array
    (
    )135 Array
    (
    )136 Array
    (
    )137 Array
    (
    )138 Array
    (
    )139 Array
    (
    )140 Array
    (
    )141 Array
    (
    )142 Array
    (
    )143 Array
    (
    )144 Array
    (
    )145 Array
    (
    )146 Array
    (
    )147 Array
    (
    )148 Array
    (
    )149 Array
    (
    )150 Array
    (
    )151 Array
    (
    )152 Array
    (
    )153 Array
    (
    )154 Array
    (
    )155 Array
    (
    )156 Array
    (
    )157 Array
    (
    )158 Array
    (
    )159 Array
    (
    )160 Array
    (
    )161 Array
    (
    )162 Array
    (
    )163 Array
    (
    )164 Array
    (
    )165 Array
    (
    )166 Array
    (
    )167 Array
    (
    )168 Array
    (
    )169 Array
    (
    )170 Array
    (
    )171 Array
    (
    )172 Array
    (
    )173 Array
    (
    )174 Array
    (
    )175 Array
    (
    )176 Array
    (
    )177 Array
    (
    )178 Array
    (
    )179 Array
    (
    )180 Array
    (
    )181 Array
    (
    )182 Array
    (
    )183 Array
    (
    )184 Array
    (
    )185 Array
    (
    )186 Array
    (
    )187 Array
    (
    )188 Array
    (
    )189 Array
    (
    )190 Array
    (
    )191 Array
    (
    )192 Array
    (
    )193 Array
    (
    )194 Array
    (
    )195 Array
    (
    )196 Array
    (
    )197 Array
    (
    )198 Array
    (
    )199 Array
    (
    )200 Array
    (
    )201 Array
    (
    )202 Array
    (
    )203 Array
    (
    )204 Array
    (
    )205 Array
    (
    )206 Array
    (
    )207 Array
    (
    )208 Array
    (
    )209 Array
    (
    )210 Array
    (
    )211 Array
    (
    )212 Array
    (
    )213 Array
    (
    )214 Array
    (
    )215 Array
    (
    )216 Array
    (
    )217 Array
    (
    )218 Array
    (
    )219 Array
    (
    )220 Array
    (
    )221 Array
    (
    )222 Array
    (
    )223 Array
    (
    )224 Array
    (
    )225 Array
    (
    )226 Array
    (
    )227 Array
    (
    )228 Array
    (
    )229 Array
    (
    )230 Array
    (
    )231 Array
    (
    )232 Array
    (
    )233 Array
    (
    )234 Array
    (
    )235 Array
    (
    )236 Array
    (
    )237 Array
    (
    )238 Array
    (
    )239 Array
    (
    )240 Array
    (
    )241 Array
    (
    )242 Array
    (
    )243 Array
    (
    )244 Array
    (
    )245 Array
    (
    )246 Array
    (
    )247 Array
    (
    )248 Array
    (
    )249 Array
    (
    )250 Array
    (
    )251 Array
    (
    )252 Array
    (
    )253 Array
    (
    )254 Array
    (
    )255 Array
    (
    )根本不会出现 WARNING
      

  10.   

    至少也得
    add_filter('the_content', 'keywords_autolink');
    function keywords_autolink($content) {
        $s = $content;
    $k = array(
      '企业管理书籍' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '企业管理' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '管理学书籍' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '管理书籍' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '管理类书籍' => '<a target="_blank" title="%s" href="http://www.12reads.cn/">%s</a>',
      '市场营销' => '<a target="_blank" title="%s" href="http://www.12reads.cn/category/eting">%s</a>',
      '职场' => '<a target="_blank" title="%s" href="http://www.12reads.cn/category/career">%s</a>'
    ); 
     
    $charset = mb_check_encoding($content, 'utf-8') ? 'utf-8' : 'gbk';
    mb_internal_encoding($charset);
     
    $d = array_keys($k);
    $t = '';
    $r = '';
    $p = array();
    for($i=0; $i<mb_strlen($content); $i++) {
      $c = mb_substr($content, $i, 1);
      if(preg_grep('/' . preg_quote($t . $c) . '/', $d)) {
        $t .= $c;
        continue;
      }
      if(isset($k[$t])){
        if(! in_array($t, $p)) {
          $p[] = $t;
          $t = sprintf($k[$t], $t, $t);
        }
      }
      $r .= $t;
      $t = $c;
    }
    //标签部分
    $tags = get_tags();
    foreach ($tags as $key){
    $name= $key->name;//取出所有标签名称
    $tag_link = get_tag_link($key->term_id);//取出标签链接
    $replacement="<a target='_blank' title='{$key->name}' href='{$tag_link}'>{$key->name}</a>";
    $pos=strpos($content, $name);
          if ($pos !== false) {
            $length=strlen($name);
            //从标签开始出现的位置按照其字符长度开始替换,因此结果是只替换一次。
            $content=substr_replace($content, $replacement, $pos, $length);
            unset($key);//最后销毁一下哦。
        }
     }
           
      return $content;
      
    }
      

  11.   

    很奇怪,你的 php 版本是多少?
    另外,你测试我 #1 的代码有问题吗?
      

  12.   

    其实我就是想在文章中替换A和B,但当有个A是由A+B组成时我写的那个程序就会替换两次,比如要在文章中替换“管理学书籍”和“经典管理学书籍”,那么当文章中出现“经典管理学书籍”时,替换结果就成了<a href="http://www.12reads.cn/tag/classicals" title="经典<a target="_blank" title="管理学书籍" href="http://www.12reads.cn/">管理学书籍</a>" target="_blank">经典管理学书籍</a>,您上面的代码真的实现不了呢。