im, пытаясь найти все упоминания совпадающего имени пользователя (sam) из текстового кода базы данных со следующим:
$sql = "select * from tweet where feed like '%@sam%'";
это вернет все строки, о которых упоминал пользователь.
но теперь проблема в том, что она также возвращает строки с @sam3, @sam-dadf или что-то, что после @sam..
как я могу это ограничить, поэтому из текста и не всех совпадающих образцов отображаются только определенное имя пользователя. Ниже приведены текстовый формат в базе данных, который вставлен в строку строки.
1. i been out with @sam today, but im
not sure what we should do
2. we head great party today and all the frineds were invited, such as @sam, @jon, @dan...
3. i been out today with @samFan and with @dj. << this row should not get pull from database``
Да, используйте REGEXP
(или RLIKE
), но следите за общей ошибкой регулярного выражения, ища конец желаемого "токена" как просто общий, отрицаемый класс символов, например [^A-Za-z0-9]
- вместо используйте конструкцию соответствия "конец слова" с нулевой шириной [[:>:]]
(какой движок perl и другое вдохновленное regexen знают как \b
).
Отключенный класс символов не может совпадать в конце строки:
mysql> SELECT 'I am @sam' REGEXP '@sam[^A-Za-z0-9]' AS "Does This Match?";
+------------------+
| Does This Match? |
+------------------+
| 0 |
+------------------+
1 row in set (0.00 sec)
где совпадение с символом слова преуспевает:
mysql> SELECT 'I am @sam' REGEXP '@sam[[:>:]]' AS "Does This Match?";
+------------------+
| Does This Match? |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)
Если [[:>:]]
не совсем подходит для вашего приложения (поскольку ваш набор символов "имя пользователя" не является тем, что движок регулярного выражения MySQL считает одной стороной границы слова в вашей локали), вы также можете указать отрицательный класс символов и отдельный тест для конца строки:
SELECT ... WHERE (feed REGEXP '@sam[^A-Za-z0-9]' or feed REGEXP '@sam$')
Я бы рекомендовал использовать регулярное выражение mysql, чтобы попытаться добиться этого.
Найдите строку sfor требуемого текста, не считая выбранных символов повтора
выберите * из таблицы, где канал REGEXP '@sam [^ A-Za-z0-9]'
Извините, но я не знаком с MySql.
В Microsoft SQL Server предложение Like может позволить вам указать поля, которые НЕ соответствуют.
Пример: if ('Мне нравится @Spam.' LIKE '% @Spam [^ a-z]%') SELECT 1