Регулярные выражения Perl и их применение


         

к одному соответствует своему двойнику


который один к одному соответствует своему двойнику в целевой строке $text. Затем в целевой строке стоит ссылка, которую и надо получить. Поэтому мы открываем захватывающую скобку. Подшаблон

[^"]+

означает "любое число символов от 1 и более, которые не содержат кавычек". Поэтому скобки сохранят нам весь текст до следующих кавычек, а это и есть ссылка. Дальше в шаблоне опять идет литерал >, а подшаблон

[^<]+

соответствует всему до открывающей угловой скобки, затем вновь идет литеральный текст, который соответствует такому же тексту в переменной $text.

Записанное регулярное выражение несовершенно. Если после <a будет не один пробел, а больше, или будет стоять перевод строки, то оператор поиска не найдет соответствия и переменная $1 будет иметь неопределенное значение (или значение, которое осталось от предыдущего оператора поиска или замены). Имейте в виду, что нумерованные переменные $1, …, $99 изменяются только при успешном поиске! Кроме того, надежнее вести поиск без учета регистра символов. С учетом этих требований, получаем такую версию нашей программы:

$text='<a href="http://www.intuit.ru/">Internet-обучение</a>'; $text =~ m#<a\s+href="([^"]+)">[^<]+</a>#i; print $1;

После <a вместо пробела теперь стоит подшаблон \s+, он берет на себя все пробельные символы, один из которых обязательно должен встретиться по правилам HTML. Кроме того, появился модификатор i. Но правила не запрещают иметь пробельные символы перед и после знака равенства, это тоже надо учесть и вставить вокруг него конструкции \s*. Надо также что-то придумать насчет кавычек, ведь на их месте могут быть апострофы или вообще ничего. Модернизированный вариант выглядит так:

$text='<a href="http://www.intuit.ru/">Internet-обучение</a>'; if ($text =~ m#<a\s+href\s*=\s*["']?([^"'> ]+)["']?>[^<]+</a>#i) { print $1 }

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

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

Это уже лучше, но в теге a могут быть параметры, например, target=_blank, как быть тогда? Тогда наш оператор поиска закончится неудачей, ведь в регулярном выражении после ссылки предусмотрены апостроф или кавычка и затем сразу идет закрывающая скобка. Параметру target=_blank ничего не будет соответствовать.

Это легко обойти, вставив перез закрывающей скобкой подшаблон

[^>]*


Содержание  Назад  Вперед





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий