我正在尝试从字符串中删除干扰词,我认为这是一个很好的算法,但我遇到了麻烦。在我执行preg_replace之前,我删除除了撇号(')之外的所有标点符号。我把它通过这个preg_replace:
$content = preg_replace('/\b('.implode('|', self::$noiseWords).')\b/','',$content);
哪种方法很有效,除了那些确实具有'特征'的单词。 preg_replace似乎将其视为边界字符。这对我来说是一个问题。
有没有办法解决这个问题?也许是一个不同的解决方案?
谢谢!
以下是我正在使用的示例:
$content = strtolower(strip_tags($content));
$content = preg_replace("/(?!['])\p{P}/u", "", $content);// remove punctuation
echo $content;// i've added striptags for editing as well should still workyep it doesnbsp
$content = preg_replace("/\b(?<')(".implode('|', self::$noiseWords).")(?!')\b/",'',$content);
$contentArray = explode(" ", $content);
print_r($contentArray);
在第3行,你会看到在preg_replace
之前$ content的评论虽然我假设你可以猜出我的noiseWords数组是什么样的,但这只是其中的一小部分:
$noiseWords = array("a", "able","about","above","abroad","according","accordingly","across",
"actually","adj","after","afterwards","again",......)
答案 0 :(得分:0)
你可以使用负面的lookbehind和积极的前瞻来确保你没有“围绕”引用字符:
$regex = "/\b(?<!')(".implode('|', self::$noiseWords).")(?!')\b/";
现在,您的正则表达式不会匹配单引号前面或后面的任何内容。