регулярное выражение для поиска всего между тегами <a> и </a>
-
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>