带有特殊字符的目标 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编码值有关)