Надежное регулярное выражение для HTML сложно . Вот как это сделать с помощью DOM :
$dom = new DOMDocument;
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $node) {
echo $dom->saveHtml($node), PHP_EOL;
}
Вышеупомянутое найдет и выведет "externalHTML" всех 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
}
Также см:
На полях: я уверен, что это дубликат, и вы можете найти ответ где-то здесь
Я согласен с Гордоном, вы ДОЛЖНЫ использовать парсер HTML для синтаксического анализа HTML. Но если вам действительно нужно регулярное выражение, вы можете попробовать это:
Это соответствует
<a
в начале строки, а затем любое количество любого полукокса (не жадные) ,.*?
тоhref=
затем по ссылке в окружении либо"
или'
Вывод:
источник
Шаблон, который вы хотите найти, будет шаблоном привязки ссылки, например (что-то):
источник
почему бы тебе просто не сопоставить
затем
который работает. Я только что снял первые фиксирующие скобы.
источник
preg_match_all("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res, PREG_SET_ORDER);
, чтобы правильно уловить все значения href в использованииforeach($res as $key => $val){echo $val[1]}
Для тех, кто все еще не получил решения, очень просто и быстро с помощью SimpleXML
Это работает для меня
источник
Я не уверен, что вы здесь пытаетесь сделать, но если вы пытаетесь проверить ссылку, посмотрите на PHP filter_var ()
Если вам действительно нужно использовать регулярное выражение, попробуйте этот инструмент, он может помочь: http://regex.larsolavtorvik.com/
источник
Используя ваше регулярное выражение, я немного изменил его в соответствии с вашими потребностями.
<a.*?href=("|')(.*?)("|').*?>(.*)<\/a>
Я лично предлагаю вам использовать парсер HTML
РЕДАКТИРОВАТЬ: проверено
источник
<a title="this" href="that">what?</a>
Быстрый тест:
<a\s+[^>]*href=(\"\'??)([^\1]+)(?:\1)>(.*)<\/a>
похоже, помогает: первое совпадение - "or", второе - значение href - "that", а третье - "что?".Причина, по которой я оставил первое совпадение "/" там, заключается в том, что вы можете использовать его для обратной ссылки позже для закрытия "/ ', так что это то же самое.
См. Живой пример на: http://www.rubular.com/r/jsKyK2b6do
источник
preg_match_all ("/ (] >) (. ?) (</ a) /", $ contents, $ impmatches, PREG_SET_ORDER);
Он протестирован и извлекает все теги из любого html-кода.
источник
Далее работает для меня , и возвращается как
href
иvalue
из тега привязки.Вызываемый многомерный массив
$urls
теперь содержит ассоциативные подмассивы, которые легко использовать.источник