Целевые URL со специальными символами - PullRequest
3 голосов
/ 27 февраля 2020

У меня есть строка с HTML, и я нацеливаю URL-адреса изображений следующим образом:

$regex = '#([a-z,:=\-_0-9\/\:\.]*\.(jpg|jpeg|png|gif))#i';

Работает нормально с:

https://example.com/image.jpg

Но когда URL-адрес имеет специальный символ Например:

https://example.com/ストスト.jpg

Это не соответствует. См. Тест !

Как изменить регулярное выражение, чтобы оно соответствовало URL-адресам, содержащим эти специальные символы?

Ответы [ 3 ]

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

В классе персонажей вам не нужно избегать , и :. Вам также не нужно экранировать /, если вы используете другой разделитель, такой как #.

. Вы можете сократить шаблон до

[\w,=/:.-]+\.(?:jpe?g|png|gif)

Regex demo | Php demo

Если вы хотите найти href от якорей, я предлагаю вместо этого использовать парсер.

Шаблон, включающий флаг Unicode u:

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

Например (использование якорей ^ и $ для предотвращения частичного совпадения)

$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;
    }
}

Вывод

Valid url: https://e...content-available-to-author-only...e.com/example1.jpg
Valid url: https://e...content-available-to-author-only...e.com/ストスト.jpg
Valid url: https://e...content-available-to-author-only...e.com/example3.jpg
Invalid url: https://e...content-available-to-author-only...e.com/example3.bak
0 голосов
/ 27 февраля 2020
'#([\p{L},:=\-_0-9\/\:\.]*\.(jpg|jpeg|png|gif))#i'

Это работает для всех символов иностранных языков. Надеюсь, что это может помочь

0 голосов
/ 27 февраля 2020

Вы всегда можете попробовать использовать флаг Юникода в регулярном выражении и посмотреть, совпадают ли эти символы или нет, например:

$regex = '#([a-zストスト,:=\-_0-9\/\:\.]*\.(jpg|jpeg|png|gif))#iu';

обратите внимание на u на конец регулярного выражения (это относится к юникоду)

Очевидно, вы можете добавить диапазон вашего алфавита, если он поддерживается.

т.е. вот так ス-ト

Другой подход может заключаться в добавлении полного алфавита в регулярное выражение, сразу после вашего параметра az. Проверьте это ответ также.

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ:

На основе вашего комментария, который относится к любому иностранному символ, лучшее, что я могу придумать, это использовать параметр \w, который означает каждый символ слова, и добавить флаг u в конце вашего регулярного выражения.

Это означает, что это может быть $regex = '#([\w,:=\-_0-9\/\:\.]*\.(jpg|jpeg|png|gif))#iu';

С этим регулярным выражением ваши 2 примера работают нормально. Жду вашего ответа:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...