php数组和str_替换一起工作

php数组和str_替换一起工作,php,arrays,str-replace,Php,Arrays,Str Replace,你好,我正在使用这个代码。我有一个问题,这个代码,当我提交 不要使用cencor和cencor 它回来了 不要使用禁止和禁止的工具 我想得到这样的结果 不要使用禁止使用的和*** 我该怎么做?谢谢大家! 在这方面有一点需要警惕,那就是有些词是其他词的子串 我记得几年前读过一篇关于这个主题的文章,它的标题有点像“CLBUTIC错误”。这篇文章详细介绍了一个执行不善的亵渎过滤器如何在解决问题的同时产生尽可能多的问题。这篇文章展示了与您在问题中使用的方法完全相同的方法的缺陷 他们关注的替换自然是$co

你好,我正在使用这个代码。我有一个问题,这个代码,当我提交

不要使用cencor和cencor

它回来了

不要使用禁止和禁止的工具

我想得到这样的结果

不要使用禁止使用的和***


我该怎么做?谢谢大家!

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

我记得几年前读过一篇关于这个主题的文章,它的标题有点像“CLBUTIC错误”。这篇文章详细介绍了一个执行不善的亵渎过滤器如何在解决问题的同时产生尽可能多的问题。这篇文章展示了与您在问题中使用的方法完全相同的方法的缺陷

他们关注的替换自然是
$content=str_replace('ass','butt',$content)。这产生了一些有趣的变化,比如“刺客”变成了“刺客”

这与您看到的问题完全相同,因为“cencor”是“cencors”的子字符串。即使您打算同时替换这两个,您仍然会看到相同的问题

解决方案是通过确保只匹配一个完整的单词,在替换的方式上更加有针对性。您可以使用基于正则表达式的方法执行此操作:

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

使用str\u-ireplace可以实现这一点吗?
str\u-ireplace
str\u-replace
有着相同的缺陷:你不能只针对整个单词。看到您对其他答案之一的评论,我确保我的答案不区分大小写-您可以看到在
preg\u replace
的第一个参数末尾,我有
~ism
~
是我选择的分隔符,但是
i
s
m
都是标志。
i
表示“不区分大小写”
<?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;