регулярное выражение для поиска всего между тегами <a> и </a>

StackOverflow https://stackoverflow.com/questions/343115

  •  19-08-2019
  •  | 
  •  

Вопрос

Я пытаюсь найти способ составить список всего, что находится между <a> и </a> Теги.Итак, у меня есть список ссылок, и я хочу получить названия ссылок (не то, куда ссылки ведут, а то, как они называются на странице).Было бы действительно полезно для меня.

В настоящее время у меня есть это:

$lines = preg_split("/\r?\n|\r/", $content);  // content is the given page
foreach ($lines as $val) {
  if (preg_match("/(<A(.*)>)(<\/A>)/", $val, $alink)) {     
    $newurl = $alink[1];

    // put in array of found links
    $links[$index] = $newurl;
    $index++;
    $is_href = true;
  }
}
Это было полезно?

Решение

Применяется стандартный отказ от ответственности:Синтаксический анализ HTML с помощью регулярных выражений не идеален.Успех зависит от правильности формирования входных данных на посимвольном уровне.Если вы не можете гарантировать это, регулярное выражение в какой-то момент не сможет выполнить правильные действия.

Сказав это:

<a\b[^>]*>(.*?)</a>   // match group one will contain the link text

Другие советы

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

Используйте настоящий HTML-анализатор.

  • Ваш код будет более понятным
  • Это с большей вероятностью сработает

Я погуглил в поисках синтаксического анализатора PHP HTML и нашел этот.

Если вы знаете, что работаете с XHTML, то вы могли бы использовать стандартный анализатор XML PHP.

<a\s*(.*)\>(.*)</a>

<a href="http://www.stackoverflow.com">Go to stackoverflow.com</a>

$1 = href="www.stackoverflow.com "

$2 = Перейти к stackoverflow.com

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

Регулярное выражение, опять же черная магия :)

Я нашел одного хороший вопрос об обычном регулярном выражении.Там есть несколько интересных ссылок, где вы найдете очень распространенные регулярные выражения, подобные вашему.

Захват HTML-тегов

< ТЕГ\b[^>]>(.?) Проанализируйте, что это регулярное выражение с помощью RegexBuddy соответствует открывающей и закрывающей паре определенного HTML-тега.Все, что находится между тегами, записывается в первую обратную ссылку.Вопросительный знак в регулярном выражении делает звездочку ленивой, чтобы убедиться, что она останавливается перед первым закрывающим тегом, а не перед последним, как это сделала бы жадная звезда.Это регулярное выражение не будет должным образом соответствовать тегам, вложенным внутри самих себя, как в onetwoone.

<([A-Z][A-Z0-9])\b[^>]>(.*?) Анализ этого регулярного выражения с помощью RegexBuddy будет соответствовать открывающей и закрывающей паре любого HTML-тега.Обязательно отключите чувствительность к регистру.Ключевым моментом в этом решении является использование обратной ссылки \1 в регулярном выражении.Все, что находится между тегами, записывается во вторую обратную ссылку.Это решение также не будет соответствовать тегам, вложенным в самих себя.

В противном случае:Перейдите по этой ссылке: ключевое слово "ссылка".Существует несколько интересных подходов к фильтрации ссылок.

Я надеюсь, что это поможет :)

Удачи!

Что ж..Использование регулярных выражений не идеально, но в perl regexp,

m!<a .*?>(.*?)</a>!i

должен дать вам название первой ссылки в этой строке в первой группе соответствия, игнорируя регистр.

Ограничения:

  • Не обрабатывает несколько ссылок в одной строке
  • Не обрабатывает ссылки, идущие по нескольким строкам.
  • Также будет совпадать с тегами привязки.

Вы могли бы обойти это, объединив все строки в одну строку, а затем разбив ее на массив (или несколько строк), используя начало ссылки в качестве разделителя.

Лучший и самый быстрый способ создать список того, что находится между ними , - это использовать preg_match_all .

Пример:

$pattern = '#<a[^>]*>([^<]*)<\/a>#';
$subject = '<a href="#">Link 1</a> <a href="#">Link 3</a> <a href="#">Link 3</a>';
preg_match_all($pattern, $subject, $matches);
print_r($matches[1]);

Результатом будет:

Array (
 [0] => Link 1
 [1] => Link 3
 [2] => Link 3
)

С рисунком

'<a.*?>(.*?)</a>'

Ты получишь

['sign up', 'log in', 'careers 2.0']

Поиск в этой разметке:

<span id="hlinks-nav"><a href="/users/login?returnurl=%2fquestions%2f343115%2fregexp-for-finding-everything-between-a-and-a-tags">sign up</a><span class="lsep">|</span><a href="/users/login?returnurl=%2fquestions%2f343115%2fregexp-for-finding-everything-between-a-and-a-tags">log in</a><span class="lsep">|</span><a href="http://careers.stackoverflow.com">careers 2.0</a><span class="lsep">|</span></span>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top