首页 > 解决方案 > 如何匹配 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 中,我不确定是否存在与我上面所拥有的等价物。有没有人有什么建议?

标签: phpregex

解决方案


在我看来,您希望验证合格的 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-z\d]{11}_\w*_\.jpg(?="$)~', $string, $out) ? $out[0] : 'no match';

输出:

https://my.site.com/image/I/fj23l6j2lgk_AM1200_.jpg

推荐阅读