我不确定它的名称,但是有一个这样的RegEx:
preg_replace('#static\/(.*)(\/|\.[a-zA-Z0-9]{2,4})#', 'path=$1$2');
它应匹配static/path/to/image.jpg
和static/path/to/dir/
。现在我想要匹配第二个模式(目录),所以用前导斜杠替换它,但如果匹配文件名(第一个模式)替换而不带前导斜杠。
示例:
`static/path/to/image.jpg` should be 'path=path/to/image.jpg'
`static/path/to/image.jpg/` should be 'path=path/to/image.jpg'
`static/path/to/dir/` should be 'path=path/to/dir/'
简单来说,如果等于$2
请求的文件,我希望忽略/
。添加?:
的想法可以解决问题,但我错了。
有没有办法做这样的事情?
答案 0 :(得分:1)
假设路径位于URL的末尾:
preg_replace('#static((?:/[^./]*(?=/))*)(/(?:\w+\.\w+)?)/?$#', 'path=$1$2');
或没有前瞻(更快):
preg_replace('#static(/(?:[^./]*/)*)(\w+\.\w+)?/?$#', 'path=$1$2');
编辑:修改了正则表达式,并附加了OP
的说明答案 1 :(得分:0)
从本质上讲,您只是将static/
替换为path=
(如果路径名如下),对吗?
然后就这样做:
$result = preg_replace(
'%static/ # Match static/
(?= # only if the following text could be matched here:
\S+ # one or more non-whitespace characters,
(?: # followed by
/ # a slash
| # or
\.\w{2,4} # a filename extension
) # End of alternation.
(?!\S) # Make sure that there is no non-space character here
) # End of lookahead.%x',
'path=', $subject);