正则表达式用任意一侧的空格替换给定的单词或根本不替换

时间:2012-11-30 10:35:40

标签: php regex preg-replace

我正在使用PHP中的一些代码来抓取搜索引擎中的引荐来源数据,为我提供用户输入的查询。

如果存在,我想从该字符串中删除某些停用词。但是,这个词可能在两端都有空格。

例如,我一直使用str_replace删除一个单词,如下所示:

$keywords = str_replace("for", "", $keywords);
$keywords = str_replace("sale", "", $keywords);

但如果$ keywords值为“baby formula”,则会将其更改为“baby mula” - 删除“for”部分。

无需创建更多str_replace的帐户“for”和“for” - 是否有一个preg_replace类型命令,我可以使用它来删除给定的单词,如果在任何一端找到空格?

我的想法是将所有停用词放入数组并以这种方式逐步执行它们,我怀疑preg_replace会比通过多个str_replace行更快。

更新 谢谢你们使用以下组合:

$keywords = "...";
$stopwords = array("for","each");
foreach($stopwords as $stopWord)
{
    $keywords = preg_replace("/(\b)$stopWord(\b)/", "", $keywords);   
}

4 个答案:

答案 0 :(得分:1)

$keywords = "...";
$stopWords = array("for","sale");
foreach($stopWords as $stopWord){
    $keywords = preg_replace("/(\b)$stopWord(\b)/", "", $keywords);
}

答案 1 :(得分:0)

以这种方式试试

$keywords = preg_replace( '/(?!\w)(for|sale)(?>!\w)/', '', $keywords );

答案 2 :(得分:0)

您可以将word boundaries用于此

$keywords = preg_replace('/\bfor\b/', '', $keywords);

或多个单词

$keywords = preg_replace('/\b(?:for|sale)\b/', '', $keywords);

答案 3 :(得分:0)

尽管Armel的答案会起作用,但效果并不理想。是的,您想要的输出将需要字边界并且可能不区分大小写,但是:

  1. 边界被包裹在括号中一无所获。
  2. 对黑名单数组中的每个元素执行迭代的preg_match()调用效率不高。这样做将要求正则表达式引擎对整个字符串逐波执行单个关键字检查。

我建议构建一个正则表达式模式,该模式将在遍历字符串的每一步(一次)中检查所有关键字。要动态生成单个模式,只需要用|(管道)内嵌元素的黑名单数组,这些元素代表正则表达式中的“ OR”命令。通过将所有以竖线分隔的关键字包装在一个非捕获组((?:...))中,字边界(\b)可用于黑名单数组中的所有关键字。

代码:(Demo

$string = "Each person wants peaches for themselves forever";
$blacklist = array("for", "each");
// if you might have non-letter characters that have special meaning to the regex engine
//$blacklist = array_map(function($v){return preg_quote($v, '/');}, $blacklist);
//print_r($blacklist);
echo "Without wordboundaries:\n";
var_export(preg_replace('/' . implode('|', $blacklist) . '/i', '', $string));

echo "\n\n---\n";
echo "With wordboundaries:\n";
var_export(preg_replace('/\b(?:' . implode('|', $blacklist) . ')\b/i', '', $string));

echo "\n\n---\n";
echo "With wordboundaries and consecutive space mop up:\n";
var_export(trim(preg_replace(array('/\b(?:' . implode('|', $blacklist) . ')\b/i', '/ \K +/'), '', $string)));

输出:

Without wordboundaries:
' person wants pes  themselves ever'

---
With wordboundaries:
' person wants peaches  themselves forever'

---
With wordboundaries and consecutive space mop up:
'person wants peaches themselves forever'

p.s。 / \K +/是馈送到preg_replace()的第二个模式,这意味着将再次读取输入字符串以搜索2个或更多连续的空格。 \K的意思是“从此处重新开始全字符串匹配”;有效地释放了先前匹配的空间。然后,要匹配的一个或多个空格将被替换为空字符串。