Константин Матыцын
86 повідомлень
#16 років тому
Проблема следующего рода:

Имеются записи в таблице.Необходимо отловить контент типа:
<a href="http://www.ityre.com/bla">bla2</a>

Необходимо удалить запись <a href="http://www.ityre.com/bla"> и </a> и оставить только bla2 .Есть соображения как написать регулярку?
Вадим Т.
3240 повідомлень
#16 років тому
Запросто. Только попробуйте разобраться самостоятельно, это действительно просто. Напишите Ваш вариант, а я поправлю если что не так, и напишу комментарии почему именно.
Андрей Халецкий
3562 повідомлення
#16 років тому
<a href=.*?>(.*?)</a>

Тогда получите искомый текст.
Не рекомендую сразу исользовать замену по регуляркам - сломаете файл )

Лучше найти все совпадения а потом сделать замену (текст который подошел под регулярку - текст который "выдрала" регулярка).
Максим В.
731 повідомлення
#16 років тому
В регулярках разбираюсь поверхностно. Насколько этот вариант правильный?
(<a href=\"http://www.ityre.com/(]*)\">)|(</a>)
Андрей Халецкий
3562 повідомлення
#16 років тому
Цитата ("VeMax"):
В регулярках разбираюсь поверхностно. Насколько этот вариант правильный?
(<a href=\"http://www.ityre.com/(]*)\">)|(</a>)


() - ограничивают часть выражения которое нужно "выбрать" для дальнейшего использования. Так их использовать не стоит.
] - очень интересная конструкция, а что она делает?

Есть очень хорошая программа, называется RegExpCoach - настоятельно рекомендую всем, кто работает с регулярками.
Ярослав С.
778 повідомлень
#16 років тому
Цитата ("tvv"):
Запросто. Только попробуйте разобраться самостоятельно, это действительно просто. Напишите Ваш вариант, а я поправлю если что не так, и напишу комментарии почему именно.


+1. да и примеров в сети, в том числе и для выборки ссылок, полно. просто нужно научиться искать
Максим В.
731 повідомлення
#16 років тому
= a-z0-9
Андрей Халецкий
3562 повідомлення
#16 років тому
Цитата ("VeMax"):
= a-z0-9
А для чего это там?
Максим В.
731 повідомлення
#16 років тому
Для замены bla, т.к. я подразумевал что это любое слово.
Андрей Халецкий
3562 повідомлення
#16 років тому
А почему там не может быть чего-то еще?

Если вам нужно взять текст ссылки - лучше так и писать, а не "все буквы-цифры после ...
Максим В.
731 повідомлення
#16 років тому
Сюда по его примеру Применил, чтобы ему было понятней.

Цитата:
лучше так и писать
- как вы написали?
Андрей Халецкий
3562 повідомлення
#16 років тому
Если задача выбрать все ссылки и достать из них то что стоит между открывающим и закрывающим тегом + известно что в <a не определены никаие свойства кроме хреф-а то да — я считаю свой вариант очень хорошим.

Насчет понятнее - очень спорно, вы там сами перепутали по-моему многое (проверьте) оно не рабочее.
Максим В.
731 повідомлення
#16 років тому
Если бы оно было не рабочее, я бы не написал. Просто насколько оно оптимальное? Может есть более быстрее варианты?
Вадим Т.
3240 повідомлень
#16 років тому
Эх, учите тут человека плохому...

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

Например, в данном случае будет прекрасно работать регексп, который привел в начале SmartDesign:

<a href=.*?>(.*?)</a>

Но если его сделать менее универсальным, адаптируя под данную задачу, то получится:

<a href="*">(*)</a>

Чем второй вариант лучше в данном случае? Тем, что будет работать примерно в 3 раза быстрее.
Максим В.
731 повідомлення
#16 років тому
Спасибо большое, вот это и требовалось.
Вадим Т.
3240 повідомлень
#16 років тому
Ну или еще можно выиграть несколько дополнительных процентов производительности (примерно на 5% быстрее, чем мой предыдущий вариант), сократив наш регексп до такой вот конструкции:

<a *>(*)

или даже так, если Ваш регексповый движок поддерживает разделитель границы слова (PCRE - поддерживает):

<a\b*>(*)

этот вариант будет и более универсальным, и также еще более быстрым.

Но вообще, если нужно обрабатывать только данные линки, и не трогать другие, то откатываемся на чуть более медленный частный случай:

<a href="http://www.ityre.com/*">(*)

В общем, надеюсь, принцип понятен.
Станислав Малкин
1410 повідомлень
#16 років тому
Цитата ("tvv"):

<a href="*">(*)</a>

Чем второй вариант лучше в данном случае? Тем, что будет работать примерно в 3 раза быстрее.

Вадим, стоит уточнить, что данный вариант будет быстр и хорошо работать, если конечно ссылки будут именно в двойных кавычках, а не в одинарных или вообще без них..Конечно можно элементарно регу подредактировать с учетом этого варианта, но уточнение довольно актуально, особенно ввиду разных криворукостей в хтмл-кодах страниц..
Вадим Т.
3240 повідомлень
#16 років тому
Я же говорю, это частный случай. Смотрите выше что я написал. Тут выбирается компромисс между универсальностью и производительностью.
Самый универсальный/быстрый вариант, обрабатывающий все линки, вот:

<a\b*>(*)

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

<a href="http://www.ityre.com/*">(*)

Если бы в условии было бы упомянуто, что в данном случае возможно иметь ссылки в том числе и в одинарных кавычках, или сслыки без кавычек, был бы другой регексп, скажем, такой:

<a href=?*>(*]http://www.ityre.com/*>(*)

А если возможно например нечто ужасное типа <a class=XXX hREF="URL" title="Y>YY">aaa<aaa</a> - то будет другой регексп... я же говорю, все зависит от задачи.
Андрей Халецкий
3562 повідомлення
#16 років тому
Согласен на счет скорости, думаю в этой задаче это не самое важное.
Пример хорош тем что он простой и по-этому будет понятен даже не опытному человеку.
Владимир Ф.
1322 повідомлення
#16 років тому
if ($text =~ m#<a\s+*?href\s*=\s*?(+)?*>+</a>#i) { print $1 }


Универсальный пример с интуита.