eugene_o

Рейтинг
114
Регистрация
10.05.2005
VHS:
можно построить монстровидный запрос через substring_index...
А еще заменить mysite.ru на что-то и уже потом искать типа

SELECT * FROM table WHERE replace(screens, 'mysite.ru', '') REGEXP "[\.A-Za-z0-9\-]+\\.[a-zA-Z]{2,4}"

Регулярку сам донастроишь

Интересно как, вот и регулярные выражения нашлись в mysql, спасибо, уже есть куда копать!

---------- Добавлено 11.01.2016 в 07:48 ----------

Вот такой вариант работает, как ни странно:

SELECT * FROM table WHERE replace(screens, 'http://www.mysite.ru', '') REGEXP 'http://'

Результаты:

Отображает строки 0 - 4 (5 всего, запрос занял 0.0605 сек.)

Поиск производился по 10315 строкам.

Меня вполне устраивает результат! Учитывая, что скрипт будет запускаться пару раз в месяц, а то и реже.

Вообще идеально решение!

Может что еще не учел..., но пока не вижу проблем абсолютно с этим запросом!

---------- Добавлено 11.01.2016 в 07:49 ----------

Спасибо всем за предложенные решения!

n00ne:
eugene_o, не совсем понимаю, Вы здесь спрашиваете или хотите что-то доказать? если спрашиваете, то ответ Вам давно дали. все Ваши проблемы - из-за неправильной организации данных. и, как мне кажется, не понимания, зачем вообще нужна БД.

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

Варианты верные, которые предложены и я их знаю прекрасно, просто хочу решить проблему всего одним regexp, не прибегая к переписыванию кода...

Знаю проблемы своего движка, он написан в 2003 году и это не единственная там проблема, просто задачи сейчас другие...

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

n00ne:
eugene_o,
если же все ответы для Вас не верные, а свой вариант Вы считаете единственно верным - разбирайтесь сами.

Вернее будет сказать: я не знаю как писать regexp, поэтому разбирайтесь без меня.

n00ne:
Вам же ответили, что в SQL нет регулярных выражений. Они там попросту не нужны. БД используется не для этого. Выбирайте данные как есть и разбирайте их в php на части.



угу. и Ваш сервер просто умрет. :D советую все же прочитать для чего используются БД.

ps. мусор выбирается до записи в БД, а не после. ;)

Как нет выражений регулярных, а это что тогда:

http://www.tutorialspoint.com/mysql/mysql-regexps.htm

?

---------- Добавлено 10.01.2016 в 11:21 ----------

bukachuk:
Нужно поле screens выделить в отдельную таблицу и связать с таблицей сайтов, потом спокойно делать выборку по LIKE. То есть нужно избавится от переводов строк, хранить данные через перевод строки в одном поле и потом по ним искать - не самая лучшая идея

Над этим вариантом подумывал уже, хранить ссылки в отдельной таблице, с указанием id записи из основной, тогда также будет возможно увеличивать кол-во строк без каких-либо значительных переделок.

Просто там получается, что поиск по этому полю и не идет никогда, на сайте идет поиск по id, а содержимое этого поля просто берется, загоняется в массив на php и выводится. Это я делаю скрипт обслуживания для админа, который запускается от силы раз в месяц, поэтому и не хочу все переписывать из-за одного админского скрипта...

К сожалению, здесь никто не может вразумительно ответить как правильно писать выражения для regexp, а советуют любые пути обхода этого...

---------- Добавлено 10.01.2016 в 11:27 ----------

Kasperaitus:
А переменная то передается?
Попробуйте в запросе вместо переменной поставить mysite.ru

Завтра посмотрю на рабочем компе, уже у самого два сомнения возникли:

- не передается переменная

- переменная передается, но в ней нужно экранировать точку.

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

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

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

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

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

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

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

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

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

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

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

Kasperaitus:
А обязательно REGEXP?
Можно LIKE
SELECT * FROM table WHERE screens NOT LIKE '%$SITE_DOMEN%'

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

Зная какие крупные ребята, сидят в этой этой нише, я бы даже не полез бы в это...

Для меня знакомства - это одна из тем, куда обычным вебмастерам вход давно закрыт.

Ну а если у вас миллионы, хватит денег на тв рекламу и т.п., как говорили выше, то можно пробовать...

А своими ботами и левыми юзерами, может вы и нагоните человек 500 туда реальных - это ничто для такого сайта.

После этого он не заведется, а просто заглохнет...

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

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

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

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

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

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

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

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

Ladycharm:
Там и будет пара строк:

$s='http://programma-biserok.ru/СКРИНШОТЫ/Схема целиком.png';
$url = parse_url($s);
$arr = explode('/', $url{'path'}); // {} ЗАМЕНИТЬ на квадратные скобки, грёбаный парсер форума!!!
$coded = array_map('rawurlencode', $arr); // Обработать массив функцией rawurlencode
$restored = 'http://'.$url{'host'} // {} ЗАМЕНИТЬ на квадратные скобки, грёбаный парсер форума!!!
.implode('/', $coded); // Собрать перекодированный url обратно
# $restored = str_replace('%23', '#', $$restored); // Ибо rawurlencode заменяет якорь '#' на ''%23'
Более интересный вопрос - а где вы берёте эти url с русскими буквами? По RFC их не должно быть в url, те у вас что-то неправильно.
А вы ещё и перекодируете их с cp1251 в utf8, тогда как "русские" url должны быть сразу в utf8, иначе браузер не покажет их русскими буквами.


PS: Для IDN-доменов придётся заюзать функцию по-сложнее, но, опять, же, если брать доменное имя в "правильном месте" - оно должно быть сразу в пуникоде. Русскими буквами браузер только ОТОБРАЖАЕТ пуникод в адресной строке, а на самом деле там содержится xn-абракадабра.

Спасибо, попробую это решение.

Ссылки могут быть любыми, с разными доменами, папками, именами файлов, у меня каталог программ, программы добавляют авторы, программ более 10 тыс., так что могут быть любые варианты...

Ссылки сохраняются в базу как их добавляют авторы, движок сайта 2003 года, тогда мне и не попадалось никаких ссылок с русскими буквами...

Согласен, все решаемо конечно, просто думал, что парой строк обойдусь, а не функцией + классом..

Всего: 302