php 数组和 str_replace 协同工作

php array and str_replace working together

    <?php
$search = array("cencor","cencors");
$change = array("prohibited","***");
if(isset($_POST['submit']) AND !empty($_POST['text'])){
$text = $_POST['text'];
$text = str_replace($search,$change,$text);
}
?>
<form action="index.php" method="post">
    <textarea name="text"><?php echo $text;?></textarea>
    <input type="submit" name="submit">
</form>

您好,我正在使用此代码。我提交

时遇到此代码问题

Don't use cencor and cencors

它returns

Don't use prohibited and prohibiteds

我想得到这样的结果

Don't use prohibited and ***

我该怎么做?谢谢!

这方面有一点需要警惕,那就是有些词是其他词的子串。

我记得几年前看过一篇关于这个主题的文章,它的标题类似于 "The Clbuttic Mistake"。这篇文章详细介绍了一个实施不当的脏话过滤器如何产生与它解决的问题一样多的问题。这篇特别的文章展示了与您在问题中使用的方法完全相同的方法的缺陷。

他们关注的替代品自然是$content = str_replace('ass', 'butt', $content);。这产生了一些有趣的转变,例如 "assassinate" 变成 "buttbuttinate".

这与您看到的问题完全相同,因为 "cencor" 是 "cencors" 的子字符串。即使您打算更换两者,您仍然遇到同样的问题。

解决方案是通过确保只匹配一个完整的词来更有针对性地进行替换。您可以使用基于正则表达式的方法来做到这一点:

<?php

$replacements = array(
    "cencor" => "prohibited",
    "cencors" => "***"
);

$text = "Don't use cencor, and cencors";

foreach($replacements as $search => $change) {
    $text = preg_replace("~(^|[\s\W])" . preg_quote($search, '~') . "([\s\W]|$)~ism", "\1{$change}\2", $text);
}

echo $text;