Preg_replace - 替换匹配的第二次出现

时间:2011-04-16 14:56:30

标签: php preg-replace preg-match

我相对较新的php,希望有人可以帮我替换正则表达式,或者可能是匹配替换我不太确定。

我想自动加粗(第二次出现一场比赛),然后第四次出现一场斜体,然后是第7次出现的比赛下划线。

这基本上是针对内容中的搜索引擎优化目的。

我已经完成了一些替换:并且认为这应该可以解决问题吗?

preg_replace( pattern, replacement, subject [, limit ])

我已经知道我想在

中使用的单词
'pattern' is also a word that is already defined like [word].
`replacement` 'This is a variable I am getting from a mysql db.
'subject' - The subject is text from a db.

让我说我有这样的内容:这或多或少解释了我想做什么。

  

这是我要替换的文本示例。在本文中,我想要第二次出现 example <胆大。然后我想跳过下一次在文本中出现的例子,并在第4次单词 example 以斜体显示。然后我想跳过第5次单词示例出现在文本中,以及第6次,最后想要第7次example出现在文本下划线。在这个例子中,我使用了超链接作为下划线示例,因为我没有在文本编辑器中看到下划线功能。单词示例在文本中可能会出现更多次,但我唯一的重复是强调一次,粗体一次并使斜体变为一次。我可能稍后决定对“例子”这个词做一些引用,但它还不是优先事项。

如果没有至少7个单词的出现,代码也不要通过错误也很重要。

我将如何做到这一点,任何想法都将不胜感激。

3 个答案:

答案 0 :(得分:3)

正则表达式本身无法计数,preg_函数提供的帮助很少。你需要一个解决方法。如果您实际上只搜索一个单词,则可能需要使用字符串函数。否则试试:

// just counting
if (7 >= preg_match_all($pattern, $subject, $matches)) {

   $cb_num = 0;
   $subject = preg_replace_callback($pattern, "cb_ibu", $subject);
}

function cb_ibu($match) {
    global $cb_num;

    $match = $match[0];

    switch (++$cb_num) {
        case 2: return "<b>$match</b>";
        case 4: return "<i>$match</i>";
        case 7: return "<u>$match</u>";
        default: return $match;
    }
}

诀窍是有一个回调来进行记账。在那里添加任何规则都很容易。

答案 1 :(得分:3)

您可以使用preg_split在匹配项中拆分文本,应用修改,然后将所有内容重新组合在一起:

$parts = preg_split('/(example)/', $str, 7, PREG_SPLIT_DELIM_CAPTURE);
if (isset($parts[3])) $parts[3] = '<b>'.$parts[3].'</b>';
if (isset($parts[7])) $parts[7] = '<i>'.$parts[7].'</i>';
if (isset($parts[13])) $parts[13] = '<u>'.$parts[13].'</u>';
$str = implode('', $parts);

第i场比赛的索引公式为 index = i ·2 - 1.

答案 2 :(得分:0)

这是一个有趣的问题。我的实施将是:

function replace_exact($word, $tag, $string, $limit) {
    $tag1 = '<'.$tag.'>';
    $tag2 = '</'.$tag.'>';
    $string = str_replace($word, $tag1.$word.$tag2, $string, 1);
    if ($limit==1) return $string;
    return str_replace($tag1.$word.$tag2,$word,$string,$limit-1);
}

像这样使用:

echo replace_exact('Example', 'b', $source_text, 2);
echo replace_exact('Example', 'i', $source_text, 4);

我不知道这会有多快,但它会比preg_replace更快。