PHP убирает шумовые слова, регулярное выражение с границами с символом '

Я пытаюсь удалить шумовые слова из строки, и у меня есть то, что я считаю хорошим алгоритмом для этого, но я сталкиваюсь с загадкой. Перед тем, как сделать 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);

В третьей строке вы увидите комментарий о том, что $ content находится перед preg_replace

И хотя я предполагаю, что вы можете догадаться, как выглядит мой массив noiseWords, вот лишь малая его часть:

$noiseWords = array("a", "able","about","above","abroad","according","accordingly","across",
        "actually","adj","after","afterwards","again",......)

1 ответ

Решение

Вы можете использовать отрицательный взгляд назад и положительный взгляд, чтобы убедиться, что вы не "вокруг" символа кавычки:

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

Теперь ваше регулярное выражение не будет совпадать с тем, что предшествует или следует с одинарной кавычкой.

Другие вопросы по тегам