我试图从一大块文本中替换一些“常用”单词,但是它只使用数组中的最后一个单词,请问你能看到我哪里出错了吗? 感谢
$glue = strtolower ($glue);//make all lower case
//remove common words
$Maffwordlist = array('the','to','for');
foreach($Maffwordlist as $Maffword)
$filtered = preg_replace("/\s". $Maffword ."\s/", " ", $glue);
上面的摘录仅从文本中删除“for”,仍然包含“the”和“to”。 任何帮助表示赞赏。
答案 0 :(得分:3)
问题在于preg_replace()
的主题始终是$glue
,它本身永远不会改变。在迭代单词列表之前,您需要将$glue
的起始内容分配到$filtered
,因为这是您正在处理的内容,以便将所有值累积到其中。
// $filtered is the string you'll be modifying...
$filtered = strtolower ($glue);//make all lower case
$Maffwordlist = array('the','to','for');
foreach($Maffwordlist as $Maffword) {
$filtered = preg_replace("/\s". $Maffword ."\s/", " ", $glue);
}
可以使用(a|b|c)
分组构建正则表达式来处理所有替换而不使用循环。
// Stick the words together with pipes
$pattern = implode("|", $Maffwordlist);
// And surround with regex delimiters and ()
// so the whole regex looks like /\s(the|to|for)\s/
$pattern = '/\s(' . $pattern . ')\s/';
// And do the operation in one go:
$filtered = preg_replace($pattern, " ", $filtered);
我会注意到您可能希望使用\b
字边界而不是\s
通过空格分隔这些边界。这样,你就可以在一句话中得到适当的替换,例如“你不应该以for。结束一个句子”,其中你的一个列表单词出现但不受空白限制。
最后,在一些已经发生替换的地方,你最终会有多个连续的空格。您可以使用以下内容将它们折叠到单个空格中。
// Replace multiple spaces with a single space
$filtered = preg_replace('/\s+/', ' ', $filtered);