регулярное выражение для поиска всего между тегами <a>и </a> - PullRequest
5 голосов
/ 05 декабря 2008

Я пытаюсь найти способ составить список всего между тегами <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;
  }
}

Ответы [ 7 ]

14 голосов
/ 05 декабря 2008

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

Сказав это:

<a\b[^>]*>(.*?)</a>   // match group one will contain the link text
3 голосов
/ 05 декабря 2008

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

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

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

Я гуглил для PHP HTML-парсера и нашел этот .

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

2 голосов
/ 05 декабря 2008
<a\s*(.*)\>(.*)</a>

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

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

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

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

0 голосов
/ 24 июня 2013

с рисунком

'<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>
0 голосов
/ 11 июня 2013

Лучший и самый быстрый способ создать список того, что между ними, - использовать 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
)
0 голосов
/ 05 декабря 2008

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

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

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

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

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

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

0 голосов
/ 05 декабря 2008

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

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

Получение HTML-тегов

] > (. ?). Анализировать это регулярное выражение с помощью RegexBuddy соответствует открывающая и закрывающая пары определенного тега HTML. Все, что находится между тегами, заносится в первую обратную ссылку. Знак вопроса в регулярном выражении делает звезду ленивой, чтобы убедиться, что она останавливается перед первым закрывающим тегом, а не перед последним, как это сделала бы жадная звезда. Это регулярное выражение не будет правильно соответствовать тегам, вложенным в себя, как в onetwoone.

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

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

Надеюсь, это поможет:)

Удачи!

...