значение регулярного выражения - PullRequest
0 голосов
/ 21 марта 2012

Кто-нибудь может объяснить значение этого регулярного выражения?

'/<div align="left"><a href="(.*?)">(.*?)<\/a><\/div>/s'

из того, что я знаю, это поиск всех тегов div align, которые равны слева но для следующей части я потерян.

Ответы [ 5 ]

1 голос
/ 23 мая 2012
'/<div align="left"><a href="(.*?)">(.*?)<\/a><\/div>/s'

Выражение выше очень специфично, в отличие от общего захвата тега <a>.Такая специфичность (жестко закодированный текст) сделает регулярное выражение «ломким» (легко ломающимся).

  1. косые черты в начале и конце являются разделителями, указывающими, что строка является строкой регулярного выражения.«S» после последней косой черты является модификатором регулярного выражения и означает, что каждый период в регулярном выражении будет соответствовать всем символам, включая символы новой строки.

  2. Обратная косая черта перед косой чертой взакрывающий тег </a> и закрывающий тег </div> являются escape-символами.Экранирующие символы необходимы из-за первой косой черты и последней косой черты, которые указывают, что строка является регулярным выражением.Следовательно, все косые черты в выражении должны быть экранированы.

  3. Это регулярное выражение будет работать только с div с точным текстом, показанным выше.Любые дополнительные атрибуты, добавленные в div, нарушат это регулярное выражение.Даже один лишний пробел в элементе div нарушит это регулярное выражение.

  4. Далее за div должен следовать тег <a> в точности так, как показано в регулярном выражении.Если к тегу <a> будут добавлены какие-либо дополнительные атрибуты, это регулярное выражение прекратит работу.Пример, если значение href отделяется одинарными кавычками вместо двойных кавычек, регулярное выражение не будет соответствовать.

  5. href может содержать любой символ.Регулярное выражение будет соответствовать всем символам в значении href, пока не будет найдена заключительная кавычка.Тег <a> должен иметь только атрибут href и ничего больше.За тегом <a> должен немедленно следовать закрывающий тег </div> точно так же, как и регулярное выражение.

  6. Основная цель регулярного выражения - «захватить» значение href и <a> текст тега для какого-то чрезвычайно специфического HTML.Обычно совпадение при захвате выводится в массив.

0 голосов
/ 21 марта 2012

Он (пытается) находит все теги привязки в выровненных по левому краю элементах div, а

  • Группа 1 соответствия - это URL
  • Группа 2 соответствия - это текст ссылки

К вашему сведению, регулярные выражения и HTML не сочетаются друг с другом, поэтому "не пытайтесь делать это дома".

0 голосов
/ 21 марта 2012

Поиск якорных тегов в элементах div с выравниванием по левому краю.Он также сохраняет текст ссылки и ссылки, чтобы к ним можно было обратиться позже.

Будет соответствовать: <div align="left"><a href="#">test</a></div>

В регулярном выражении есть пара ошибок: во-первых, использованиеоператора точки (".") следует избегать.Он предназначен для соответствия всем, кроме новых строк, что означает следующее:

<div align="left"><a href="#">test</a><a href="#">test</a></div>

Это сохранит текст как "test", а href как "#">test</a><a href="#".

0 голосов
/ 21 марта 2012

. означает любой отдельный символ

* означает ноль или более предыдущего элемента (который является жадным оператором)

? послезвезда странная в этой позиции.Обычно ? после . означает «один или несколько из предыдущего элемента» или, если используется, как этот (?:.*) означает «сопоставить что-либо, но не создавать обратную ссылку».

Итак href="(.*)"также должно точно соответствовать тому, что будет соответствовать href="(.*?)".

В любом случае ваш шаблон совпадения должен быть:

$0 будет равен всему div

$1 будетравное значение внутри href

$2 будет равно значению внутри тега

Вы можете попробовать регулярные выражения онлайн на http://www.regextester.com/ - есть также различные приложения и виджеты дляВаша ОС для тестирования.

0 голосов
/ 21 марта 2012

Независимо от того, для чего это нужно и будет ли оно работать или нет (регулярное выражение не является опцией для сопоставления HTML-тегов), для пояснения, вторая часть регулярного выражения <a href="(.*?)">(.*?)<\/a><\/div>/s просто «пытается»сопоставьте все теги anchor с любым URL-адресом, за которым следует текст, который будет содержать этот URL-адрес.

Когда я говорю «пытаюсь», это то, что человек, написавший регулярное выражение, намеревался сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...