Регулярное выражение в Mysql

12
EO
На сайте с 10.05.2005
Offline
114
2086

Здравствуйте!

Просьба помочь с регулярным выражением в mysql.

Есть поле screens, в котором могут содержаться до 10 ссылок, разделенных переводами строк.

Нужно найти строки в базе, у которых в этом поле присутствуют ссылки (от 1 до 10), не содержащие мой домен $SITE_DOMEN.

$SITE_DOMEN = 'mysite.ru';

Вот такой запрос я написал:

SELECT * FROM table WHERE screens REGEXP 'http://www\.[^($SITE_DOMEN)]+'

Также еще нужно учесть, что www. - тоже необязательно будет в таких ссылках.

Мой запрос ничего не находит для вот такого значения поля screens и подобных:

http://www.mysite.ru/images/screens/4282-6.jpg

http://www.mysite.ru/images/screens/4282-1.jpg
http://www.mysite.ru/images/screens/4282-2.png
http://www.mysite.ru/images/screens/4282-3.jpg
http://www.drugoisite.ru/program/img/WinACE_1.jpg

Как правильно написать регулярное выражение?

Бооольшой портал о мааалом бизнесе (http://www.bizguru.ru/) | Более 1000 бизнес-программ (http://1.44mb.ru) По выходным не работаю - не ищите меня в сети. В понедельник я обычно сам возвращаюсь :)
N
На сайте с 06.05.2007
Offline
419
#1
eugene_o:
SELECT * FROM table WHERE screens REGEXP 'http://www\.[^($SITE_DOMEN)]+'

Ну как же вы документацию то не прочитали ?

В mysql другой синтаксис регулярных выражений более старый - posix.

Вы пытаетесь использовать perl-синтаксис.

Кнопка вызова админа ()
EO
На сайте с 10.05.2005
Offline
114
#2
netwind:
Ну как же вы документацию то не прочитали ?
В mysql другой синтаксис регулярных выражений более старый - posix.
Вы пытаетесь использовать perl-синтаксис.

А никак я ее не читал, честно говоря, знаю PHP, сегодня впервые столкнулся с тем, что нужно регулярное выражение в mysql использовать, нашел пару примеров в сети + свои знания PHP, так и написал.

Не смог найти примера с моей ситуацией когда нужно найти отрицание слова....

Поэтому прошу помощи, подскажите, где ошибки?

---------- Добавлено 09.01.2016 в 15:02 ----------

А в документации написано:

[^...] Any character not listed between the square brackets

я так и написал: [^($SITE_DOMEN)] все кроме слова, к квадратных скобках...

K
На сайте с 08.04.2010
Offline
89
#3

А обязательно REGEXP?

Можно LIKE

SELECT * FROM table WHERE screens NOT LIKE '%$SITE_DOMEN%'
EO
На сайте с 10.05.2005
Offline
114
#4
Kasperaitus:
А обязательно REGEXP?
Можно LIKE
SELECT * FROM table WHERE screens NOT LIKE '%$SITE_DOMEN%'

Можно конечно, НО у меня поле может содержать до 10 ссылок, разделенных переводом строк, т.е. в поле могут быть ссылки с $SITE_DOMEN и без него одновременно. Если бы поле содержало всего одну ссылку, я бы и тему не заводил бы :)

L
На сайте с 03.05.2006
Offline
171
#5

Я бы все эти строки растащил по строкам таблицы

EO
На сайте с 10.05.2005
Offline
114
#6
luxs:
Я бы все эти строки растащил по строкам таблицы

Это все понятно, но когда движок давно сделан., не хочется переписывать в 10-30 местах и потом глюки еще ловить полголда..

Может это не самое лучшее решение в движке, но работает надежно и не хочется терять эту надежность.

L
На сайте с 03.05.2006
Offline
171
#7

В таком случае напишите хотя бы как у вас

$SITE_DOMEN = 'mysite.ru';
выглядит для нескольких записей.
N
На сайте с 23.01.2008
Offline
74
#8
eugene_o:
Можно конечно, НО у меня поле может содержать до 10 ссылок, разделенных переводом строк, т.е. в поле могут быть ссылки с $SITE_DOMEN и без него одновременно. Если бы поле содержало всего одну ссылку, я бы и тему не заводил бы :)

единственный способ найти - это как указано выше not like %site%. у Вас не правильная организация данных. отсюда и такие сложности. поиск происходит по записям, а не по Вашим строкам. ;)

Центик
На сайте с 07.01.2016
Offline
20
#9
n00ne:
это как указано выше not like %site%

При таком подходе ТС получит записи где в поле screens нет урла его сайта. Но такой запрос не дает гарантию что там вообще есть какие-то ссылки. А унего стоит задача

eugene_o:
в этом поле присутствуют ссылки (от 1 до 10), не содержащие мой домен $SITE_DOMEN.

Я бы делал проверку на уровне PHP - там возможности шире чем у мускула

LinkBoss.net - Трастовые ссылки для увеличения трафика в 10 раз! (http://linkboss.net/)
EO
На сайте с 10.05.2005
Offline
114
#10
n00ne:
единственный способ найти - это как указано выше not like %site%. у Вас не правильная организация данных. отсюда и такие сложности. поиск происходит по записям, а не по Вашим строкам. ;)

А разве нельзя все же написать правильное регулярное выражение?

Понимаю, что не самая лучшая организация данных, но как и писал выше, не вижу смысла переписывать в 30 местах код чтобы избежать одного регулярного выражения. У моей организации данных есть и плюс, если я захочу хранить в этом поле вместо 10 ссылок, 20 или 100, то я могу просто увеличить число полей в форме ввода (одну циферку в цикле) и весь сайт будет это поддерживать.

---------- Добавлено 10.01.2016 в 06:15 ----------

Центик:
При таком подходе ТС получит записи где в поле screens нет урла его сайта. Но такой запрос не дает гарантию что там вообще есть какие-то ссылки. А унего стоит задача
Я бы делал проверку на уровне PHP - там возможности шире чем у мускула

Задача стоит найти поля, где есть ссылки не моего сайта, которые могут соседствовать со ссылками моего сайта.

Насчет php думал уже, если не смогу так решить проблему, придется на php проверять... Просто скрипт будет неэффективно работать получается, будет находить в базе все подряд, а потом выводить лишь некоторые строки.

Нашел онлайн тестер, в нем работает мое выражение...странно: http://sqlfiddle.com/#!2/01bb39/1

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий