如何在脚本中使用通配符删除URL末尾的checkedby可变后缀
解决方法
TrimEnd()仅支持固定字符/固定字符串批量匹配,不适合处理可变后缀场景,针对你需要删除URL末尾所有以?checkedby:或&checkedby:开头内容的需求,直接用正则替换即可实现,适配你列出的所有URL场景。
核心实现代码
只需要在将字符串转为Uri对象之前,加一行正则替换逻辑即可:
# 清理URL末尾的checkedby片段 $cleanUrl = $url -replace '[?&]checkedby:.*$', ''
完整修改后的脚本
Add-Type -AssemblyName System.Web # 原始输入URL(可替换为实际接收的输入变量) $url = "http://toto.site:8080/user/password12349876toolong/2716?checkedby:toto.net" # 清理末尾的checkedby相关片段 $cleanUrl = $url -replace '[?&]checkedby:.*$', '' # 后续统一使用清理后的$cleanUrl做解析 $uri = [System.Uri]$cleanUrl $query = $uri.Query $IPTVhost = $uri.Host $IPTVport = $uri.Port $Segments = $uri.Segments.TrimEnd('/') $proto = $uri.Scheme $ParsedQueryString = [System.Web.HttpUtility]::ParseQueryString($uri.Query) if(!$query) { if ($Segments[1].TrimEnd('/') -eq "live"){ $username = $Segments[2].TrimEnd('/') $password = $Segments[3].TrimEnd('/') } else { $username = $Segments[1].TrimEnd('/') $password = $Segments[2].TrimEnd('/') } } else { $username = $ParsedQueryString['username'] $password = $ParsedQueryString['password'] } cls # 检测原始URL是否包含checkedby片段(可选逻辑) if ($url -match '[?&]checkedby:') { echo "this is a checkedby url" echo "filter : $cleanUrl" } echo "url: $url" echo "cleaned url: $cleanUrl" echo "query: $query" echo "host: $IPTVhost" echo "port: $IPTVport" echo "segment: $Segments" echo "proto: $proto" echo "username: $username" echo "password: $password"
正则规则说明
[?&]checkedby:.*$的匹配逻辑:
[?&]:匹配?或者&两种标记前缀checkedby::匹配固定的标记头.*$:匹配从该位置开始直到URL末尾的所有字符
替换为空字符串即可直接删除整个末尾的checkedby片段,哪怕是带两个?的不规范URL也能正常匹配处理。
内容的提问来源于stack exchange,提问作者Rickey Mandraque
相关产品推荐
相关产品推荐

