Получение атрибута href элемента A

Пытаюсь найти ссылки на странице.

мое регулярное выражение:

/<a\s[^>]*href=(\"\'??)([^\"\' >]*?)[^>]*>(.*)<\/a>/

но, похоже, не в

<a title="this" href="that">what?</a>

Как бы я изменил свое регулярное выражение, чтобы иметь дело с href, не помещенным первым в теге?

Ответы на вопрос(10)

почему бы тебе просто не соответствовать

"<a.*?href\s*=\s*['"](.*?)['"]"

<?php

$str = '<a title="this" href="that">what?</a>';

$res = array();

preg_match_all("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res);

var_dump($res);

?>

затем

$ php test.php
array(2) {
  [0]=>
  array(1) {
    [0]=>
    string(27) "<a title="this" href="that""
  }
  [1]=>
  array(1) {
    [0]=>
    string(4) "that"
  }
}

который работает. Я только что удалил первые скобы захвата.

 mostafaznv09 авг. 2015 г., 12:56
@IgnacioBustos работал нормально
 Ignacio Bustos22 окт. 2013 г., 17:33
я рекомендую использоватьpreg_match_all("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res, PREG_SET_ORDER); чтобы правильно отловить все значения href при использованииforeach($res as $key => $val){echo $val[1]}

Следующее работает для меня и возвращает обаhref а такжеvalue якорного тега.

preg_match_all("'\<a.*?href=\"(.*?)\".*?\>(.*?)\<\/a\>'si", $html, $match);
if($match) {
    foreach($match[0] as $k => $e) {
        $urls[] = array(
            'anchor'    =>  $e,
            'href'      =>  $match[1][$k],
            'value'     =>  $match[2][$k]
        );
    }
}

Многомерный массив называется$urls содержит теперь ассоциативные подмассивы, которые просты в использовании.

preg_match_all ( "/ (]>) (.?) (</ a) / ", $ content, $ impmatches, PREG_SET_ORDER);

Он протестирован и извлекает все теги из любого HTML-кода.

Я согласен с Гордоном, вы ДОЛЖНЫ использовать анализатор HTML для анализа HTML. Но если вы действительно хотите регулярное выражение, вы можете попробовать это:

/^<a.*?href=(["\'])(.*?)\1.*$/

Это соответствует<a в начале строки, за которой следует любое количество символов (не жадных).*? затемhref= следуют по ссылке, окруженной либо" или же'

$str = '<a title="this" href="that">what?</a>';
preg_match('/^<a.*?href=(["\'])(.*?)\1.*$/', $str, $m);
var_dump($m);

Выход:

array(3) {
  [0]=>
  string(37) "<a title="this" href="that">what?</a>"
  [1]=>
  string(1) """
  [2]=>
  string(4) "that"
}
 Michal - wereda-net28 нояб. 2014 г., 18:51
просто для информации: если мы ищем текст, содержащий много элементов, выражение (. *?) неверно
Решение Вопроса

Надежный Regex для HTML сложен, Вот как это сделать сDOM:

$dom = new DOMDocument;
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $node) {
    echo $dom->saveHtml($node), PHP_EOL;
}

Выше будет найти и вывести"OuterHTML" из всехA элементы в$html строка.

кполучить все текстовые значения узла, вы делаете

echo $node->nodeValue; 

кпроверять еслиhref атрибут существует, вы можете сделать

echo $node->hasAttribute( 'href' );

кполучить href атрибут, который вы бы сделали

echo $node->getAttribute( 'href' );

кменять href атрибут, который вы бы сделали

$node->setAttribute('href', 'something else');

кУдалить href атрибут, который вы бы сделали

$node->removeAttribute('href'); 

Вы также можете запроситьhref приписывать непосредственно сXPath

$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//a/@href');
foreach($nodes as $href) {
    echo $href->nodeValue;                       // echo current attribute value
    $href->nodeValue = 'new value';              // set new attribute value
    $href->parentNode->removeAttribute('href');  // remove attribute
}

Также см:

Лучшие методы для разбора HTMLDOMDocument в php

На заметку: я уверен, что это дубликат, и вы можетенайти ответ где-то здесь

 Asciiom10 окт. 2013 г., 16:11
Надежное регулярное выражение для разбора HTML по своей сути невозможно, даже если HTML не является обычным языком.

Быстрый тест:<a\s+[^>]*href=(\"\'??)([^\1]+)(?:\1)>(.*)<\/a> Похоже, что дело в том, что первое совпадение - это «или», второе - «href», значение «that», а третье - «что?».

Причина, по которой я оставил первое совпадение с "/", заключается в том, что вы можете использовать его для обратной ссылки на него позже для закрытия "/ ', так что это то же самое.

Смотрите живой пример на:http://www.rubular.com/r/jsKyK2b6do

 CharlesLeaf29 сент. 2010 г., 12:30
@bergin уточни пожалуйста, что не работает? Я получаю точное значение из href в вашем тестовом HTML. Что вы ожидаете, что это не делает? Я вижу, что вы используете другой сайт для тестирования, там я также успешно получаю значение 'href' из вашего примера.myregextester.com/?r=d966dd6b

Используя ваше регулярное выражение, я немного изменил его в соответствии с вашими потребностями.

<a.*?href=("|')(.*?)("|').*?>(.*)<\/a>

Я лично предлагаю вам использоватьHTML Parser

РЕДАКТИРОВАТЬ: Протестировано

 Ruel29 сент. 2010 г., 12:33
@bergin, Привет, я изменил свой ответ, и теперь он работает.
 bergin29 сент. 2010 г., 12:28
используя myregextester.com - извините, не находит ссылки
 Ruel29 сент. 2010 г., 12:41
Можете ли вы сказать мне текст, чтобы соответствовать? Я использую:<a title="this" href="that">what?</a>
 bergin29 сент. 2010 г., 12:38
он говорит: нет совпадений. ПРОВЕРЬТЕ ДЛЯ РАЗБОРКИ РАЗДЕЛИТЕЛЯ.

Шаблон, который вы хотите найти, будет шаблоном привязки ссылки, например (что-то):

$regex_pattern = "/<a href=\"(.*)\">(.*)<\/a>/";
 funerr09 сент. 2016 г., 13:36
Что если якорь имеет больше атрибутов?

Я не уверен, что вы пытаетесь сделать здесь, но если вы пытаетесь проверить ссылку, тогда посмотрите на PHP filter_var ()

Если вам действительно нужно использовать регулярное выражение, воспользуйтесь этим инструментом, он может помочь:http://regex.larsolavtorvik.com/

Для тех, кто до сих пор не получил решения очень просто и быстро, используя SimpleXML

$a = new SimpleXMLElement('<a href="www.something.com">Click here</a>');
echo $a['href']; // will echo www.something.com

Это работает для меня

Ваш ответ на вопрос