简单的str_replace()使错误 - WordPress

时间:2014-07-24 19:27:37

标签: php regex wordpress replace add-filter

我需要对我网站上的某些文字进行一些特殊过滤,如下所示:

function special_text( $content ) {
    $search_for = 'specialtext';
    $replace_with = '<span class="special-text"><strong>special</strong>text</span>';
    return str_replace( $search_for, $replace_with, $content );
}    
add_filter('the_content', 'special_text', 99);

它正在以一种很好的方式做事,但是......

在内容中,如果有任何链接,例如:<a title="specialtext" href="http://specialtext.com">specialtext</a>,那么标题和href文本也会发生变化,链接也会被破坏。

我如何在那里制作例外?

有没有办法可以在数组中添加一些异常而str_replace()只是跳过它们?

3 个答案:

答案 0 :(得分:2)

您应该使用正则表达式并使用函数preg_replace()来替换匹配的字符串。以下是special_text()函数的完整实现。

function special_text( $content ) {
    $search_for = 'specialtext';
    $replace_with = '<span class="special-text"><strong>special</strong>text</span>';
    return preg_replace( '/<a.*?>(*SKIP)(*F)|'.$search_for.'/m', $replace_with, $content );
}  

在下面的正则表达式中,首先使用<a.*?> - 匹配<a...>之间的所有内容并使用(*SKIP)(*F)|将其跳过,然后匹配任何其他$search_for(在你的情况是specialtext)。

答案 1 :(得分:1)

Jezzabeanz得到了它,除了你可以用它来简化它:

return preg_replace("/^def/", $replace_with, $content);

答案 2 :(得分:0)

如果您只想更改 a 标记之间的文字,那么正则表达式可以创建奇迹。

以下是我从发送给我的电子邮件中提取数据时使用的内容:

(?<=">)(.*?\w)(?=<\/a)

返回“specialtext”

如果有空格,它也会返回“特殊文本测试”。

正则表达式绝对是最佳选择。

$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);
print_r($matches);
?>

Source

然后对返回的匹配进行替换。