Как извлечь hrefs из HTML с помощью PHP

0

Предположим, у меня есть действительный html файл, который я сохраняю в строке. Теперь я хочу извлечь ссылки якорных элементов (hrefs). Поэтому я хочу использовать чистые регулярные выражения.

preg_match_all('/<a [^>]*href="(.+)">/', $html, $match);

Обычно я хочу получить такую строку:

http://www.thisIsAHrefLinkIWantToHave.de

Но вместо этого я получаю также следующую строку, логическую вызванную (. +) В регулярном выражении:

index?a=f">Link</a> &nbsp; <a href="index?a=ds">Link 2</a> &nbsp; <a href="index?b=b">Link 3</a> &nbsp; <a href="index?gf=d">Link 4</a> &nbsp; <a href="index?ttt=q">Link 5</a> &nbsp; <a href="index?g=my">Link 6</a> &nbsp; <a href="http://mysite.org

Я нашел такие решения, как Xpath или DOMDocument (PHP String Manipulation: Extract hrefs). Но я хотел бы иметь решение без этих/любых библиотек, просто с регулярным выражением. Что мне нужно сделать, чтобы решить вопрос о моем регулярном выражении?

Я думал о первом "к следующему". Но как создать этот шаблон или другой шаблон, который решает проблему?

[EDIT:] Решение

preg_match_all('/<a [^>]*href="([A-Za-z0-9\/?=:&_.]+)?"/', $html, $match);
Теги:
href
anchor

2 ответа

0
Лучший ответ

Муса прав, потому что период (.) Является жадным. попробуйте [A-Za-z0-9 _] + вместо. +

  • 0
    Я думаю, это был правильный намек. Я добавил несколько символов '/ <a [^>] * href = "([A-Za-z0-9 \ /? =: & _.] +)?" /'. Спасибо!
1

Попробуйте preg_match_all('/<a [^>]*href="(.+)?">/', $html, $match); , ? делает .* не жадный.

  • 0
    Спасибо! Я пытался, но это не имело никакого значения.
  • 0
    @ user2853437 почему бы не использовать domdocument ???
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню