2012-06-20 2 views
0

Как я могу совместить все слово в mysql?MySQL REGEXP для соответствия всего слова

Например, если я типа в 'Lau', я не хотите, чтобы соответствовать 'Лору' или 'Лоранс'.

Ниже мой рабочий запрос, который соответствует 'Lau' с 'Лауры'

SELECT * 
FROM 
(
    SELECT 

     p.page_id, 
     p.page_url AS url, 
     p.page_title AS title, 
     SUBSTRING_INDEX(p.page_content_1, ' ', 500) AS content, 
     EXTRACT(DAY FROM p.page_backdate) AS date, 
     EXTRACT(MONTH FROM p.page_backdate) AS month, 
     EXTRACT(YEAR FROM p.page_backdate) AS year 

    FROM root_pages AS p 

    WHERE p.page_hide != '1' 
    AND p.page_url != 'cms' 
    AND p.page_url != 'search' 

    ORDER BY p.page_created DESC 
) x 
WHERE x.content REGEXP '>[^<]*lau' 

Любая идея, чтобы исправить мою REGEXP?

Причины я использую REGEXP '>[^<]*searchtext' в том, что мое содержании есть HTML-теги, такие как,

<p class="heading-sitemap">About us</p> 
<ul> 
<li class="subheading-sitemap">The team</li> 
<li><a href="#">Introduction to gt</a></li> 
<li><a href="#">Simon x</a></li> 
<li><a href="#">Cathrin xe</a></li> 
<li><a href="#">Patrick x</a></li> 
<li><a href="#">Laurence x</a></li> 
<li><a href="#">Tessa x</a></li>> 
</ul> 

Я не хочу, чтобы искать слово может упасть внутри тегов, такие как <a href="http://laura.com">.

+0

Кажется, вам требуется много работы, и много фильтрации здесь. удачи. Я предлагаю вам сделать фильтрацию шаг за шагом. Для этого могут потребоваться подзапросы и/или несколько запросов. –

+0

См. Также раздел «Связанный раздел SO» в правой боковой панели. У многих пользователей были такие же проблемы. -> –

ответ

2

Это работает?

REGEXP '[^ <] * лау [[:>:]]'

Согласно documentation, [[:>:]] будет соответствовать границе слова в конце слова

+0

спасибо за ответ, andrew. – laukok

+0

Вы полностью приветствуетесь. – andrewsi

3

Давайте разберем текущее регулярное выражение:

>[^<]*lau 

>  match the character '>' 
[^<]* match 0 or more non-'<' characters 
lau match 'lau' 

Так что матч будет следующее:

>bbblau 
>bbb<lau 
>lau 
><lau 

Я предполагаю, что вы хотите, чтобы соответствовать следующим образом:

>lau 

Но не:

>laubbb 
><lau 
>bbb<lau 

В этом случае следующее регулярное выражение будет работать:

>lau(|<|$) 

Edit: с помощью метод, показанный andrewsi, может быть более чистым:

>lau[[:>:]] 
+1

спасибо за ответ, но он возвращает какой-то странный результат. только эта работа ok ''> [^ <]*lau[[:>:]]' '. – laukok

2

Код andrewsi не работал для меня, но этот REGEXP решил мою проблему.

m_city REGEXP '[[: <:]] YOUR_CITY [[:>:]]'

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