@P747

Паттерн для выборки ссылок сортировкой по заданному домену/анкору?

Добрый день, допустим есть ссылки в теле html:

<a href="https://yandex.ru/link1">Яндекс Link1</a>
<a href="https://yandex.ru/link2">Link2 Яндекс</a>

<a href="https://google.com/link1">Google Link1</a>
<a href="https://google.com/link2">Link2 Google</a>


Как с помощью preg_match_all получить ссылки:

1. Только для домена google.com, тоесть "https://google.com/link1" и "https://google.com/link2"
2. Ссылки, где есть в анкоре регистронезависимое слово "Link1", тоесть "https://yandex.ru/link1" и "https://google.com/link1"
  • Вопрос задан
  • 95 просмотров
Пригласить эксперта
Ответы на вопрос 2
@dodo512
https://regex101.com/r/T4vyCb/1/
'#<a [^>]*href="(https://google\.com/[^"]*).+?</a>#isu'


https://regex101.com/r/T4vyCb/2/
'#<a [^>]*href="([^"]+)"[^>]*>(?:(?!</a>).)*\bLink1\b#isu'
Ответ написан
Комментировать
abyrvalg
@abyrvalg
Вы точно хотите парсить html регэкспами? Одумайтесь, ведь может прийти Он.

Как-то так, может?

$doc = new DOMDocument();
$doc->loadHTML($htmlAsString);
$links = $doc->getElementsByTagName('a');

function filterByHref(DOMNodeList $anchors, string $hrefRegex): array {
    $links = [];
    /** @var DOMElement $elm */
    foreach ($anchors as $elm) {
        if (! $elm->hasAttribute('href')) {
            continue;
        }
        $link = $elm->getAttribute('href');
        if (preg_match($hrefRegex, $link)) {
            $links[] = $link;
        }
    }

    return $links;
}

var_export([
    'cnt' => $links->length,
    'goo' => filterByHref($links, '|^https://google.com\b|'),
    'link' => filterByHref($links, '|link1|i'),
], false);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы