Например, у меня есть следующий абзац в поле таблицы базы данных MySQL
«Отключение освещения объекта астрономического объекта, как в затмении Луны, когда Земля находится между"
Здесь слово « объект » появляется дважды подряд (рядом друг с другом).
Я хочу проверить, появляется ли этот случай в других записях в одной таблице. Есть ли простой способ сделать это, используя PHP и MySQL
if (preg_match('/\\b(\\w+)\\s\\1\\b/', $subject)) { //has repetition }
Это регулярное выражение работает: (\b\w+\b)(?=\s?\1)
(см. Пример )
Чтобы заставить его работать в MySQL, границы Word ( \b
) должны быть заменены эквивалентом MySQL [[:<:]]
и [[:>:]]
и \w
с [[:alnum:]]
:
SELECT * FROM your_table WHERE your_field REGEXP '([[:<:]][[:alnum:]]+[[:>:]])(?=\\s?\\1)';
Но этот запрос дает ошибку, потому что, по словам Мэтта, MySQL не поддерживает обратные ссылки . Таким образом, это невозможно с текущим MySQL REGEXP.
Вы можете использовать следующее регулярное выражение для своих целей:
(\b\w+)(?:\s+\1)+
или
\b(\w+)(?:\s+\1)+
Это будет соответствовать любому количеству повторяющихся слов с любым количеством пробелов между словами.
Обратите внимание, что в зависимости от того, как работает механизм регулярных выражений MySQL или PHP (в зависимости от того, какой из них вы используете), возможно, потребуется экранирование обратных косых (и, возможно, скобок), и вам нужно будет использовать любые разделители, используемые движком regex для шаблонов. (Хотя, если MySQL не разрешает обратные ссылки как состояния Matt, тогда вам просто нужно использовать PHP для этого.)
EDIT: обновление с помощью проверки границы слова; не понимал, что \w
не выполняет проверку границ слов автоматически для шаблонов preg.
SELECT * FROM table WHERE Поле REGEXP 'search term'
Вернет строки, содержащие соответствующий термин.
как насчет
SELECT * FROM yourtable WHERE yourfield LIKE "%yourword%%yourword%"
в моей быстрой тестовой таблице на localhost это сработало.