:条件RegEx忽略一个值

时间:2013-01-28 07:22:07

标签: php regex preg-replace

我不确定它的名称,但是有一个这样的RegEx:

preg_replace('#static\/(.*)(\/|\.[a-zA-Z0-9]{2,4})#', 'path=$1$2');

它应匹配static/path/to/image.jpgstatic/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请求的文件,我希望忽略/。添加?:的想法可以解决问题,但我错了。

有没有办法做这样的事情?

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);