如何在 php 中匹配包含固定数量的字母数字字符的 https url 的字符串?



我有一个字符串,看起来像:

"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"
}

最新更新