Может, кто-нибудь покажет мне, как использовать preg_match_all для захвата ссылок в списке, где целевая веб-страница находится на том же веб-сайте? Все ссылки, которые я пытаюсь получить в результатах поиска, выглядят так:
<a href="/">Home</a>
<a href="/about-us">About Us</a>
<a href="/contact-us">Contact Us</a>
Примеры ссылок, которые я не хочу включать в результаты:
<a href="http://www.facebook.com">Visit Us On Facebook</a>
<a href="https://www.paypal.com">Pay Now</a>
Я потратил час на поиск в Интернете и нашел только примеры, которые показывают все ссылки на веб-странице, не исключая тот же веб-сайт.
Спасибо.
Вы можете попробовать приведенное ниже регулярное выражение, чтобы сопоставить все теги привязки, в которых содержимое его атрибута href начинается с /
условное обозначение.
<a href="(\/[^"]*)">[^<>]*<\/a>
Код:
<?php
$string = <<<EOT
<a href="/">Home</a>
<a href="/about-us">About Us</a>
<a href="/contact-us">Contact Us</a>
<a href="http://www.facebook.com">Visit Us On Facebook</a>
<a href="https://www.paypal.com">Pay Now</a>
EOT;
echo preg_match_all('~<a href="(\/[^"]*)">[^<>]*<\/a>~', $string, $matches);
print_r($matches[0]);
print_r($matches[1]);
?>
Выход:
3Array
(
[0] => <a href="/">Home</a>
[1] => <a href="/about-us">About Us</a>
[2] => <a href="/contact-us">Contact Us</a>
)
Array
(
[0] => /
[1] => /about-us
[2] => /contact-us
)
Вот решение с использованием DOM …
$dom = DOMDocument::loadHTML('
<a href="/">Home</a>
<a href="/about-us">About Us</a>
<a href="/contact-us">Contact Us</a>
<a href="http://www.facebook.com">Visit Us On Facebook</a>
<a href="https://www.paypal.com">Pay Now</a>
');
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//a[substring(@href, 1, 1) = "/"]');
foreach ($nodes as $node) {
$links[] = $node->getAttribute('href');
}
print_r($links);
Вы также можете использовать preg_match()
функция с DOM.
$xpath = new DOMXPath($dom);
$xpath->registerNamespace('php', 'http://php.net/xpath');
$xpath->registerPHPFunctions('preg_match');
$nodes = $xpath->evaluate("//a[php:functionString('preg_match', '~^/~', @href)=1]");
foreach ($nodes as $node) {
$links[] = $node->getAttribute('href');
}
print_r($links);