Эта функция фильтрует электронную почту из текста и возвращает сопоставленный шаблон
function parse($text, $words) { $resultSet = array(); foreach ($words as $word){ $pattern = 'regex to match emails'; preg_match_all($pattern, $text, $matches, PREG_OFFSET_CAPTURE ); $this->pushToResultSet($matches); } return $resultSet; }
Подобным образом я хочу $resultSet
плохие слова с текстом и возвращать их как $resultSet
.
Вот код для фильтрации имен
ТЕСТИРОВАТЬ ЗДЕСЬ
$badwords = array('shit', 'fuck'); // Here we can use all bad words from database $text = 'Man, I shot this f*ck, sh/t! fucking fu*ker sh!tf*cking sh\t ;)'; echo "filtered words <br>"; echo $text."<br/>"; $words = explode(' ', $text); foreach ($words as $word) { $bad= false; foreach ($badwords as $badword) { if (strlen($word) >= strlen($badword)) { $wordOk = false; for ($i = 0; $i < strlen($badword); $i++) { if ($badword[$i] !== $word[$i] && ctype_alpha($word[$i])) { $wordOk = true; break; } } if (!$wordOk) { $bad= true; break; } } } echo $bad ? 'beep ' : ($word . ' '); // Here $bad words can be returned and replace with *. }
Что заменяет badwords beep
Но я хочу подтолкнуть плохие слова к $this->pushToResultSet()
и вернуться, как в первом коде фильтрации электронной почты.
могу ли я сделать это с помощью моего плохого кода фильтрации?
Грубо преобразуя ответ Дэвида Атчли на PHP, работает ли это так, как вы этого хотите?
$blocked = array('fuck','shit','damn','hell','ass'); $text = 'Man, I shot this f*ck, damn sh/t! fucking fu*ker sh!tf*cking sh\t ;)'; $matched = preg_match_all("/(".implode('|', $blocked).")/i", $text, $matches); $filter = preg_replace("/(".implode('|', $blocked).")/i", 'beep', $text); var_dump($filter); var_dump($matches);
JSFiddle для рабочего примера.
Да, вы можете сопоставлять плохие слова (сохранение на потом), заменять их в тексте и динамически строить регулярное выражение на основе массива плохих слов, которые вы пытаетесь фильтровать (вы можете сохранить его в БД, загрузить из JSON и т. Д. ). Вот основная часть рабочего примера:
var blocked = ['fuck','shit','damn','hell','ass'], matchBlocked = new RegExp("("+blocked.join('|')+")", 'gi'), text = $('.unfiltered').text(), matched = text.match(matchBlocked), filtered = text.replace(matchBlocked, 'beep');
См. Приведенную выше ссылку JSFiddle для полного рабочего примера.