regexp для нахождения всего между <a> и </a> теги

Я пытаюсь найти способ войти в список всего между <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;
  }
}
5
задан Wiktor Stribiżew 8 October 2019 в 23:37
поделиться

5 ответов

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

Сказав, что:

<a\b[^>]*>(.*?)</a>   // match group one will contain the link text
15
ответ дан 18 December 2019 в 07:57
поделиться

Я - большой поклонник regexes, но это не правильное место для использования их.

Используйте реальный синтаксический анализатор HTML.

  • Ваш код будет более четким
  • Это, более вероятно, будет работать

Я Погугленный для синтаксического анализатора HTML PHP и найденный этим.

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

3
ответ дан 18 December 2019 в 07:57
поделиться

Regex, черная магия, снова :)

Я нашел один деликатный вопрос об общем regex. Там некоторые интересные ссылки, где Вы найдете очень общий regexpressions как Ваш.

Захват HTML-ТЭГОВ

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

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

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

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

Удачи!

0
ответ дан 18 December 2019 в 07:57
поделиться
<a\s*(.*)\>(.*)</a>

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

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

2$ = переходят к stackoverflow.com

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

2
ответ дан 18 December 2019 в 07:57
поделиться

Хорошо.. Используя регулярные выражения не прекрасно, но в жемчуге regexp,

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

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

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

  • Не обрабатывает несколько ссылок на одну строку
  • Не обрабатывает ссылки, пробегающиеся через несколько строк.
  • Будет также соответствовать на тегах привязки.

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

0
ответ дан 18 December 2019 в 07:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: