Регулярное выражение, чтобы соответствовать всем ссылкам, которые содержат конкретные слова в якоре? - PullRequest
0 голосов
/ 31 мая 2018

Я ищу регулярное выражение в PHP для извлечения ссылок из текста, содержащего определенные слова (apple, home, car) в тексте якоря.

Важно: форматирование ссылок неизвестны заранее.

Например:

<a href="fruit.html">The Apple red</a>
<a href="Construction.html#one">The big Home</a>
<a href="automotive.html?lang=en">Car for rent</a>

Желаемый результат:

fruit.html
Construction.html#one
automotive.html?lang=en

Мой шаблон:

/<a.*?href="(.*)".*?>apple|car|home<\/a>/i

Обновление: Этот шаблон работает

'/<a.+href=["\'](.*)["\'].*>(.*(?:apple|car|home).*)<\/a>/iU'

1 Ответ

0 голосов
/ 04 июня 2018

Вы можете использовать DOMDocument и использовать getElementsByTagName для получения <a> элементов.

Тогда вы можете использовать preg_match ирегулярное выражение с чередованием со словами, которые вы хотите найти, и добавьте границы слов, чтобы убедиться, что слова не являются частью большего соответствия.Для учета нечувствительности к регистру вы можете использовать флаг /i.

\b(?:apple|big|car)\b

$data = <<<DATA
<a href="fruit.html">The Apple red</a>
<a href="Construction.html#one">The big Home</a>
<a href="automotive.html?lang=en">Car for rent</a>
<a href="fruit.html">The Pineapple red</a>
<a href="Construction.html#one">The biggest Home</a>
<a href="automotive.html?lang=en">Cars for rent</a>
DATA;

$dom = new DOMDocument();
$dom->loadHTML($data);

foreach($dom->getElementsByTagName("a") as $element) {
    if (preg_match('#\b(?:apple|big|car)\b#i', $element->nodeValue)) {
        echo $element->getAttribute("href") . "<br>";
    }
}

Демо

Это даст вам:

fruit.html
Construction.html#one
automotive.html?lang=en
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...