PHP停止单词列表

Dom*_*son 5 php arrays performance words

我正在玩我的代码中的停用词我有一个充满了我想检查的单词的数组,以及我要检查的一系列单词.

目前我一次循环一个数组并删除单词如果它的in_array与停止单词列表但是我想知道是否有更好的方法,我看了array_diff然而如果我在第一个数组中有多个停用词,只显示array_diff以删除第一个匹配项.

重点是速度和内存使用,但速度更快.

编辑 -

第一个数组是基于博客评论的单数词(这些通常很长)第二个数组是停用词的单数词.很抱歉没有说清楚

谢谢

Pau*_*xon 8

使用str_replace ...

一个简单的方法是使用str_replacestr_ireplace,它可以采用一系列' needle '(要搜索的东西),相应的替换和一系列'haystacks'(操作的东西).

$haystacks=array(
  "The quick brown fox",
  "jumps over the ",
  "lazy dog"
);

$needles=array(
  "the", "lazy", "quick"
);

$result=str_ireplace($needles, "", $haystacks);

var_dump($result);
Run Code Online (Sandbox Code Playgroud)

这产生了

array(3) {
  [0]=>
  string(11) "  brown fox"
  [1]=>
  string(12) "jumps over  "
  [2]=>
  string(4) " dog"
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,清除尾随空格的快速方法是使用array_map为每个元素调用trim

$result=array_map("trim", $result);
Run Code Online (Sandbox Code Playgroud)

使用str_replace函数的缺点是,它会替换找到的匹配范围内的话,而不仅仅是整个单词.为解决这个问题,我们可以使用正则表达式......

使用preg_replace

使用preg_replace的方法与上面的方法非常相似,但针是正则表达式,我们使用\ b检查匹配开始和结束时的"字边界"

$haystacks=array(
"For we shall use fortran to",
"fortify the general theme",
"of this torrent of nonsense"
);

$needles=array(
  '/\bfor\b/i', 
  '/\bthe\b/i', 
  '/\bto\b/i', 
  '/\bof\b/i'
);

$result=preg_replace($needles, "", $haystacks);
Run Code Online (Sandbox Code Playgroud)