使用正则表达式替换单词

时间:2015-02-26 14:16:36

标签: php regex preg-replace

我有一个网站,用户内容需要在发布之前进行过滤(评论等)。目前我有一个系统,扫描会在单词列表中发布内容,然后用星号替换这些单词。

这适用于单个单词,但我现在正在寻找替换单词序列而我有点迷失。

对于示例,我们将使用PayPal。目前我的正则表达式找到并替换了这个罚款,但是如果我想搜索并替换'Pay Pal'则不然。这是我的替换代码,适用于目前为止的单个单词:

$word = $words->word;
$length = strlen($word);

$replacement = str_repeat('*', $length);

$newContent = preg_replace('/\b'.$word.'\b/i', $replacement, $content);

所以我需要用' * * '代替'pay pal'。

理想情况下,空间将是一个通配符来拾取诸如'pay_pal'之类的东西,但这只是一件好事。

我玩过但无济于事。

澄清一下 - 如何修改它以替换两个单词以及一个单词?

1 个答案:

答案 0 :(得分:0)

$newContent = preg_replace('/\b'.$word.'\b/i', $replacement, $content);

那很糟糕。真的,非常糟糕。这就像坐直升机去离家20米远的地方购物一样。

对于完全固定的文本块,请使用str_replace()

$newContent = str_replace($word, $replacement, $content);
// If you want it to be surrounded with spaces use the one below:
$newContent = str_replace(" $word ", $replacement, $content);

对于更复杂的“PayPal”,我建议您以“Pay * Pal”或其他方式存储。例如:

$badWord = 'Pay*Pal';
$pattern = '~\b'.str_replace('*','.?',$badWord).'\b~Ui'; 
// dont use 'i' flag if you want it case-sensitive
$newContent = preg_replace($pattern, $replacement, $content);