Проблема с регулярными выражениями
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;
И кстати, указывайте язык разработки, раз здесь пишите, регулярки есть разные.
П.С. Ех.... а форматирование кода так и не поправлено(
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"):Ну да возможно не совсем по заданию, но я тоже повторюсь потому что мой учел теги внутри )) И тогда я просто писал регулярку на быструю руку и с учет того что парсить будут не гугл, вы вроде тоже первую нечто похожее написали, потом модифицировали, так что смысл спорить если оба варианта работают ))Проверьте на таком тексте: <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.
может у меня как то по особому php.ini настроенхоть сомневаюсь, но у меня работает
rapidshare.com/files/177711943/xengine.zip.html
3240 сообщений
#16 лет назад
xengine, проверьте пожалуйста Ваш регексп на любом тесте, где было бы несколько ссылок в одной строке (не разделенных переносом строки). Потом постарайтесь разобраться, и напишите, почему так получилось, где у Вас закралась ошибка. Я, если честно, немного устал объяснять одно и то же.