2014-11-03 2 views
0

Я нашел эту ссылку и отработал ее, но мне нужно расширить ее чуть дальше. Check if string contains word in arrayПоиск совпадающих слов без ложных positivis

Я пытаюсь создать скрипт, который проверяет веб-страницу на известные плохие слова. У меня есть один массив со списком плохих слов, и он сравнивает его со строкой из file_get_contents.

Это работает на базовом уровне, но возвращает ложные срабатывания. Например, если я загружаю веб-страницу со словом «title», он возвращает, что нашел слово «tit».

Моя личная ставка, чтобы удалить все html и пунктуацию, а затем взорвать его на основе пробелов и поместить каждое отдельное слово в массив? Я надеюсь, что тогда будет более эффективный процесс.

Вот мой код до сих пор:

$url = 'http://somewebsite.com/'; 
$content = strip_tags(file_get_contents($url)); 

//list of bad words separated by commas 
$badwords = 'tit,butt,etc'; //this will eventually come from a db 
$badwordList = explode(',', $badwords); 

foreach($badwordList as $bad) { 
    $place = strpos($content, $bad); 
    if (!empty($place)) { 
     $foundWords[] = $bad; 
    } 
} 

print_r($foundWords); 

Заранее спасибо!

ответ

2

Вы можете просто использовать регулярные выражения с preg_match_all():

$badwords = 'tit,butt,etc'; 
$regex = sprintf('/\b(%s)\b/', implode('|', explode(',', $badwords))); 

if (preg_match_all($regex, $content, $matches)) { 
    print_r($matches[1]); 
} 

Второй оператор создает регулярное выражение, которое мы используем, чтобы соответствовать и захватить нужные слова от веб-страницы. Сначала он разбивает строку $badwords на запятую и присоединяется к ним с помощью |. Эта результирующая строка затем используется как шаблон, подобный этому: /\b(tits|butt|etc)\b/. \b (который является границей слов) обеспечит соответствие только целых слов.

Этот шаблон регулярного выражения будет соответствовать любому из этих слов, а слова, которые находятся на веб-странице, будут храниться в массиве $matches[1].

+0

Похоже, что это хорошо работает. Спасибо –

+0

Теперь, если вы можете сделать мне еще одну услугу. Первый отправленный вами код еще вернул ложный результат, но ваше обновление исправило его. Можете ли вы объяснить, что делает \ b? За свою жизнь я не могу обернуть голову вокруг регулярного выражения. –

+0

@DeveloperGee: Как я упоминаю в ответе, '\ b' утверждает позицию на границе слова; в основном где-нибудь между символом слова (буквы, цифры и т. д.) и символом без слов (все остальное). Для получения дополнительной информации см. Http://www.regular-expressions.info/wordboundaries.html –

Смежные вопросы