替换文本时仅使用数组的最后一个元素

时间:2013-12-29 03:08:53

标签: php regex arrays preg-replace

我试图从一大块文本中替换一些“常用”单词,但是它只使用数组中的最后一个单词,请问你能看到我哪里出错了吗? 感谢

$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”。 任何帮助表示赞赏。

1 个答案:

答案 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);