我需要对我网站上的某些文字进行一些特殊过滤,如下所示:
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()
只是跳过它们?
答案 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);
?>
然后对返回的匹配进行替换。