带有特殊字符的目标 URL

Posted

技术标签:

【中文标题】带有特殊字符的目标 URL【英文标题】:Target URLs with special characters 【发布时间】:2020-06-11 15:47:05 【问题描述】:

我有一个带有 html 的字符串,我的目标图像 URL 是这样的:

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

适用于:

https://example.com/image.jpg

但是当一个 URL 有一个特殊字符时,比如:

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

不匹配。 See test!

如何更改正则表达式,使其与具有这些特殊字符的 URL 匹配?

【问题讨论】:

无需转义字符类中的元字符***.com/questions/19976018/… 另外,你确定它不匹配吗? 3v4l.org/ZudaJ 您需要查找包括 unicode 字符在内的所有内容 - 例如 regex101.com/r/wdabX7/1 @waterloomatt 您可以使用我的正则表达式代码作为基础发布答案吗? @njank 只匹配文件名而不匹配整个 URL。 【参考方案1】:

您总是可以尝试在正则表达式上使用 unicode 标志,看看这些字符是否匹配,如下所示:

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

注意正则表达式末尾的u(它指的是unicode)

显然,如果支持,您可以添加字母范围。

即像这样ス-ト

另一种方法是在正则表达式中添加完整的字母表,就在您的 a-z 参数之后。也检查一下这个answer。

希望对你有帮助!

编辑:

根据您提到任何外来字符的评论,我能想到的最好的事情是使用参数\w,这意味着每个单词字符,并在您的正则表达式末尾添加u 标志。

这意味着它可能是$regex = '#([\w,:=\-_0-9\/\:\.]*\.(jpg|jpeg|png|gif))#iu';

使用此正则表达式,您的 2 个示例可以正常工作。等待您的回复:)

【讨论】:

但是我的目标不是专门针对ストスト这些字符,而是所有外文字符。您能否使用我的正则表达式代码作为参考来编辑您的答案?【参考方案2】:
'#([\pL,:=\-_0-9\/\:\.]*\.(jpg|jpeg|png|gif))#i'

这适用于所有外语字符。 希望这可以帮助

【讨论】:

好像不行,请see this... $domain 未定义【参考方案3】:

在字符类中,您不必转义,:。如果您使用不同的分隔符,例如 #,您也不必转义 /

您可以将模式缩短为

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

Regex demo | php demo

如果你想从锚点中找到 href,我建议改用解析器。

包含u unicode 标志的模式:

$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

【讨论】:

以上是关于带有特殊字符的目标 URL的主要内容,如果未能解决你的问题,请参考以下文章

PostMan发送请求参数带有路径特殊字符会返回400错误(与URL字符及URL编码值有关)

我需要做啥才能打开带有特殊字符的 URL

使用带有特殊字符的 Django 的 url 模板标签

使用带有特殊字符的 URL 名称是个好主意吗? [关闭]

带有 åäö(特殊字符)的 Alamofire GET 请求,无效 url

301 将带有特殊字符的 URL 重定向到主页 htaccess