Ил Миха
56 повідомлень
#16 років тому
Народ незабываем о \s и о \i
Вадим Т.
3240 повідомлень
#16 років тому
В условии задачи не говорилось про перенос строк внутри тега и про возможный upper case, поэтому, если в это не нужно по задаче, лучше избегать излишней универсальности в пользу более высокой производительности.
Николай М.
1895 повідомлень
#16 років тому
Можно и без регулярок обойтись, они тяжёлые, вот Delphi код:

var
s:string;
i:integer;
begin
s:='<a href="http://www.ityre.com/bla">bla2</a>';

i:=Pos('">', s); // ищем позицию
s:=Copy(s, i+2, length(s)-i-5); // вырезаю то что надо
ShowMessage(s); // показываю результат
end;


И кстати, указывайте язык разработки, раз здесь пишите, регулярки есть разные.

П.С. Ех.... а форматирование кода так и не поправлено(
Константин Матыцын
86 повідомлень
#16 років тому
"/<a href=\"(.*?)\">(.*?)<\/a>/", "\\2"
Вадим Т.
3240 повідомлень
#16 років тому
О, для начала неплохо.
А теперь пожалуйста объясните, почему Вы сделали именно так? (объясните каждую конструкцию в Вашем регекспе)
И предложите, как это можно улучшить.
Ил Миха
56 повідомлень
#16 років тому
Цитата:
В условии задачи не говорилось про перенос строк внутри тега и про возможный upper case, поэтому, если в это не нужно по задаче, лучше избегать излишней универсальности в пользу более высокой производительности.

\i действительно можно упустить если конечно известно что верстка xhtml, везде и нигде не допущена ошибка, честно сказать скорость сомнительная
\s перевод строки? o_O пробел существует в ссылке, мой вариант #<a\shref="(?:.+)">(.+)<\/a>#
Вадим Т.
3240 повідомлень
#16 років тому
Цитата ("xengine"):
\s перевод строки? o_O пробел существует в ссылке, мой вариант #<a\shref="(?:.+)">(.+)<\/a>#

А, ясно. Я подумал что Вы имели в виду именно модификатор s (PCRE_DOTALL, dot also matches newlines), по аналогии с i, посколько и i является таким модификатором (PCRE_CASEALL, ignore case when matching).

Кстати, если уж на то пошло, и нужно учитывать любой пробельный символ(ы) то нужно там ставить не \s, а \s+ ))

Но даже если взять мой вариант

<a\b*>(*)

то обратите внимание на \b, и теперь ответьте на вопрос, нужно ли там \s

Но в любом случае, Ваш вариант

#<a\shref="(?:.+)">(.+)<\/a>#

в корне неверен, так как не будет корректно работать (по крайней мере в PCRE), если в тексте будет несколько тегов <a> ... в Вашем примере нет ограничения "жадности". Да и избыточен этот вариант, первая пара скобок - лишняя.
Ил Миха
56 повідомлень
#16 років тому
__мое__ выражение будет работать точно так же как ваше, я не проверял, но конструкции вычитания подобно вашей(по квантификатору жадности), в особенно не правильно построенных документах учтет только то что до < а может быть вложеный тег, как показывает практика, так что тут вопрос спорный
Юрий Осадчий
661 повідомлення
#16 років тому
Ну и добавлю: не стоит забывать о "диалектах"
а регулярки -- это хорошая вещь, в той же википедии достаточно материала....
а вот вопросы типа "такая строка, как составить регэксп" -- сразу ффтопку, ибо это указывает на нежелание думать, скажу как преподаватель в прошлом
Вадим Т.
3240 повідомлень
#16 років тому
Цитата ("xengine"):
__мое__ выражение будет работать точно так же как ваше, я не проверял, но конструкции вычитания подобно вашей(по квантификатору жадности)

А я проверял.
Увы, не работает Ваш регексп если ссылок в тексте больше одной, из-за той самой пресловутой жадности.
Вот и Вы проверьте ))

И еще раз повторюсь, если бы по задаче было необходимо обрабатывать, скажем, вложенные теги, или какие-либо еще конструкции, я бы построил другой регексп. Но для текущей задачи достаточно того что я привел, причем это оптимальный по производительности вариант (Ваш вариант, даже если бы он работал корректно, был бы более медленным в 2-3 раза минимум).
Ил Миха
56 повідомлень
#16 років тому
Ну да возможно не совсем по заданию, но я тоже повторюсь потому что мой учел теги внутри )) И тогда я просто писал регулярку на быструю руку и с учет того что парсить будут не гугл, вы вроде тоже первую нечто похожее написали, потом модифицировали, так что смысл спорить если оба варианта работают ))
может у меня как то по особому php.ini настроен хоть сомневаюсь, но у меня работает
rapidshare.com/files/177711943/xengine.zip.html
Андрей Халецкий
3562 повідомлення
#16 років тому
Цитата ("xengine"):
Ну да возможно не совсем по заданию, но я тоже повторюсь потому что мой учел теги внутри )) И тогда я просто писал регулярку на быструю руку и с учет того что парсить будут не гугл, вы вроде тоже первую нечто похожее написали, потом модифицировали, так что смысл спорить если оба варианта работают ))
может у меня как то по особому php.ini настроен хоть сомневаюсь, но у меня работает
rapidshare.com/files/177711943/xengine.zip.html
Проверьте на таком тексте: <a href="site.com">site-text</a> asdadasdasdad<a href="site2.com">site2-text</a>asdadasdasdad<a href="site3.com">site3-text</a> По идее вы должны получить 3 результата, по вашему регекспу будет 1.
Вадим Т.
3240 повідомлень
#16 років тому
xengine, проверьте пожалуйста Ваш регексп на любом тесте, где было бы несколько ссылок в одной строке (не разделенных переносом строки). Потом постарайтесь разобраться, и напишите, почему так получилось, где у Вас закралась ошибка. Я, если честно, немного устал объяснять одно и то же.
Станислав Малкин
1410 повідомлень
#16 років тому
Ну не знает человек, что такое квартификтор жадности Другое дело, что упирается рогом, не понятно только зачем