Совпадать только если начинается с символов - PullRequest
3 голосов
/ 28 февраля 2020

У меня есть это регулярное выражение для сопоставления с URL-адресами изображений в HTML коде:

$regex = '#[\w,=/:.-]+\.(?:jpe?g|png|gif)#iu';

Regex demo

Php demo :

$input = <<<HTML
<a href="https://e...content-available-to-author-only...e.com/example1.jpg">
<a href="https://e...content-available-to-author-only...e.com/ストスト.jpg">
<a href="https://e...content-available-to-author-only...e.com/example3.jpg">
<a href="https://e...content-available-to-author-only...e.com/example3.bak">
HTML;

$dom = new DomDocument();
$dom->loadHTML(mb_convert_encoding($input, 'HTML-ENTITIES', "UTF-8"));

$anchors = $dom->getElementsByTagName("a");
$regex = '#^[\w,=/:.-]+\.(?:jpe?g|png|gif)$#iu';

foreach ($anchors as $anchor) {
    $res = $anchor->getAttribute("href");
    if (preg_match($regex, $res)) {
        echo "Valid url: $res" . PHP_EOL;
    } else {
        echo "Invalid url: $res" . PHP_EOL;
    }
}

Мой вопрос: как я могу сделать так, чтобы он совпадал, только если он начинается с http или //. В настоящее время он совпадает с example.jpg, который не является полным URL.

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Я бы предложил такой шаблон: href="((?:http|\/\/)[^"]+\.(?:jpe?g|png|gif))"

Объяснение:

href=" - буквально совпадать href=", это гарантирует, что вы будете соответствовать гиперссылке

(...) - группа захвата для сохранения фактической ссылки

(?:...) - группа без захвата

http|\/\/ - совпадение http или //

[^"]+ - соответствует 1+ любых символов, отличных от "

\. - соответствует . буквально

jpe?g|png|gif - изменение, совпадение опций jpeg, jpg (из-за e?), png, gif*, 1037 *

" - совпадать " буквально

Демо

Соответствующая ссылка будет внутри 1-й группы захвата.

1 голос
/ 28 февраля 2020

Соответствие либо http, либо // в начале строки может быть выполнено с ^(?:http|//) т, что вам нужно добавить в начале. Чтобы убедиться, что URL заканчивается указанными вами расширениями, вам нужно добавить $ в конце.

Поскольку вы получаете строку URL из атрибута тега, используя $anchor->getAttribute("href"), вам не нужно проверять внутренний текст URL, я предлагаю заменить [\w,=/:.-]+ на .*, чтобы соответствовать любому тексту между ними.

Итак, вы можете использовать

$regex = '#^(?:http|//).*\.(?:jpe?g|png|gif)$#iu';

Подробности

  • ^ - начало строки
  • (?:http|//) - http или //
  • .* - любые 0+ символов, кроме разрыва строки символов, как можно больше
  • \. - . char
  • (?:jpe?g|png|gif) - jpeg, jpg, png или gif строки
  • $ - конец строки.

Если вы хотите, чтобы он работал с текстом HTML, вам необходимо использовать

$regex = '#\bhref=(["\']?)((?:http|//)[^"\']*\.(?:jpe?g|png|gif))\1#iu';
if (preg_match_all($regex, $txt, $matches)) {
    print_r($matches[2]);
}

См. regex demo .

Подробности

  • \b - граница слова
  • href= - буквальный текст
  • (["\']?) - Группа 1: " или ', захваченные в Группе 1
  • ((?:http|//)[^"\']*\.(?:jpe?g|png|gif)) - Группа 2: * 10 70 *
  • (?:http|//) - http или //
  • [^"\']* - 0+ символов, отличных от ' и "
  • \. - a .
  • (?:jpe?g|png|gif) - строка расширения
\1 - то же значение, что и в группе 1, либо " или ', либо пусто.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...