我有一个字符串,看起来像:
"res":"https://my.site.com/image/I/fj23l6j2lgk_AM1200_.jpg"
我的 bash 正则表达式是(如果我们让上面等于$str
(:
echo $str | grep -oE ""res":"https://my.site.com/image/I/[[:alnum:]]{11}._[a-zA-Z0-9_]*_.jpg""
| grep -oE "my.site.com/image/I/[[:alnum:]]{11}._[a-zA-Z0-9_]*_.jpg" | head -1
干净利落地提取出https://my.site.com/image/I/fj23l6j2lgk_AM1200_.jpg
.
在PHP中,我不确定是否存在与我上面相同的等价物。有人有什么建议吗?
在我看来,您希望验证符合条件的 url 是否用双引号括起来并且前面有"res":
,那么您只想提取URL。
开头的回溯和结尾的前瞻将验证确切的完整字符串。
点必须转义才能被视为字符串文本。
你在下划线之前有一个额外的点,我不相信你想保留。
如果您使用非斜杠字符作为模式分隔符,则不需要转义正斜杠(我将使用~
(。
[a-zA-Z0-9_]
更简洁地写成w
。
代码:(演示(
$string = '"res":"https://my.site.com/image/I/fj23l6j2lgk_AM1200_.jpg"';
echo preg_match('~(?<=^"res":")https://my.site.com/image/I/[a-zA-zd]{11}_w*_.jpg(?="$)~', $string, $out) ? $out[0] : 'no match';
输出:
https://my.site.com/image/I/fj23l6j2lgk_AM1200_.jpg
你只需要转义正则表达式中的所有/
和.
,这很好。我还删除了末尾附近的一个点。
my.site.com/image/I/[[:alnum:]]{11}_[a-zA-Z0-9_]*_.jpg
在这里试试。
使用 PHP 时,你可以通过以下方式选择它:
$subject = '"res":"https://my.site.com/image/I/fj23l6j2lgk_AM1200_.jpg"';
$regex = '/https://my.site.com/image/I/[[:alnum:]]{11}_[a-zA-Z0-9_]*_.jpg/'
preg_match($regex , $subject , $matches);
var_dump($matches);
输出 :
array(1) {
[0]=>
string(51) "https://my.site.com/image/I/fj23l6j2lgk_AM1200_.jpg"
}