PHP数组和str_replace一起工作

时间:2019-02-20 11:12:41

标签: php arrays str-replace

    <?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>

您好,我正在使用此代码。我对这段代码有疑问,当我提交

  

不要使用cencor和cencors

返回

  

请勿使用禁止和禁止的东西

我想得到类似的结果

  

请勿使用禁止和***

我该怎么做?谢谢!

1 个答案:

答案 0 :(得分:2)

在这方面需要警惕的是,有些单词是其他单词的子字符串。

我记得几年前读过一篇有关该主题的文章,标题为“ The Clbuttic Mistake”。文章详细介绍了实施不当的亵渎过滤器会如何解决所解决的许多问题。这篇特别的文章展示了与您在问题中使用的方法完全相同的方法的陷阱。

他们关注的替代品自然是$content = str_replace('ass', 'butt', $content);。这产生了一些有趣的转变,例如“暗杀”变成了“ 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;