PHP删除带有'字符边界的噪声词正则表达式

时间:2012-07-31 01:21:45

标签: php regex preg-replace word-boundary

我正在尝试从字符串中删除干扰词,我认为这是一个很好的算法,但我遇到了麻烦。在我执行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",......)

1 个答案:

答案 0 :(得分:0)

你可以使用负面的lookbehind和积极的前瞻来确保你没有“围绕”引用字符:

$regex = "/\b(?<!')(".implode('|', self::$noiseWords).")(?!')\b/";

现在,您的正则表达式不会匹配单引号前面或后面的任何内容。