我有几个带有img标签和绝对图像路径的html文件。我想删除绝对部分,然后留下相对路径。
EG。 http://domain1.com/media/uploads/2017/11/image-test-1.jpg https://domain2.org/photos/uploads/2016/08/anotherimage.png
这两个人最终会这样:
图像/图像测试1.JPG 图像/ anotherimage.png
我该如何做到这一点?
这就是我目前所拥有的:
preg_replace( "@(http[s]*?://[-\w\.]+)(\/\w+\.(png|jpg))@", 'images/$2', $url );
它将所有内容归还到上传目录,但经过一些调整后它根本不起作用......
答案 0 :(得分:2)
我的模式将匹配从http
到网址中的最后一个/
,并将其替换为images/
。
代码:(Demo)
$urls=[
'http://domain1.com/media/uploads/2017/11/image-test-1.jpg',
'https://domain2.org/photos/uploads/2016/08/anotherimage.png'
];
$urls=preg_replace('~https?://(?:[^/]*/)*~','images/',$urls);
var_export($urls);
输出:
array (
0 => 'images/image-test-1.jpg',
1 => 'images/anotherimage.png',
)
模式说明:
~ #Pattern delimiter
https?:// #Match http:// or https://
(?: #Start non-capturing group
[^/]* #Match zero or more non-slash characters
/ #Match slash
) #End non-capturing group
* #Match zero or more occurrences of the non-capturing group
~ #Pattern delimiter
这是pattern demo。 *注意,我必须将\s
添加到否定的字符类中,以使其与一个字符串中的多个网址匹配。
至于你的模式:
@
( #this generates capture group number 1
http
[s]*? #simpler would be: s?
://
[-\w\.]+ #dot doesn't need escaping; this will match [-A-Za-z0-9_.]
)
( #this generates capture group number 2
\/ #escaping is not necessary, just use: /
\w+ #this will match one or more of [A-Za-z0-9_]
\. #this will match literal dot
(png|jpg) #this generates capture group number 3 containing png or jpg
)
@
修复您的模式:(Demo)
/
以将[-\w.]
更改为:[-\w./]
\w+
更改为[\w-]+
images$2