1

只有在没有“?”的情况下,我如何才能匹配路径?最后加上零个或多个字符。

我有以下路径:

/something/contentimg/coast03.jpg?itok=ABC

我想要文件名,但前提是文件扩展名后没有“?something”。

我试过了:

 /^.*\/(.*)(?!\?.*)$/

但无论如何它都匹配。这就是结果。我究竟做错了什么?

Array
(
    [0] => /something/contentimg/coast03.jpg?itok=ABC
    [1] => coast03.jpg?itok=ABC
)

使用 php。

4

4 回答 4

3

使用parse_url

print_r(parse_url('/something/contentimg/coast03.jpg?itok=ABC'))

(
    [path] => /something/contentimg/coast03.jpg
    [query] => itok=ABC
)
于 2013-09-12T09:00:59.633 回答
1

量词表现得很贪婪,匹配到正则表达式末尾的*所有内容,因此负前瞻在输入末尾开始(当然不会找到它正在寻找的内容)。正则表达式应该有一点不同:

/^.*\/([^?]+)$/

此表达式匹配一个或多个非问号字符,然后断言它已到达输入字符串的末尾,这就是您想要做的。

于 2013-09-12T09:01:45.613 回答
0

这是它当前的匹配方式:

.*- 贪婪地匹配到最后一个之前/- /something/contentimg
\/- 匹配/
(.*)- 匹配字符串的其余部分 - coast03.jpg?itok=ABC
(?!\?.*)- 检查后面的字符是否不匹配,因为我们已经在末尾了,它显然不会匹配。

你应该做什么:

似乎您可以检查?字符串中是否存在 a ,因此请尝试:

/^(?!.*\?)/

或匹配到最后一个,然后从那里/检查 a :?

/^(?!.*\/.*\?)/

解释:

您已经知道(?!...)是负前瞻,只是不完全确定如何使用它。无论你把它放在哪里,它都会尽力从那个位置开始匹配给定的模式。如果成功,则正则表达式不匹配。所以把它放在最开始并尝试匹配字符串的其余部分可能是一个好主意。

所以这个例子的基本格式是:

/^(?!...).*$/

其中(?!...)包含要排除的字符串的模式。

.*$末尾的 不应该是必需的,如果您想检查整个字符串,请记住前瞻末尾$的 。

/^(?!...$)/
于 2013-09-12T09:01:59.730 回答
0
^.*\/([^?]+)(?![?].+)$

工作演示

您的表达式不起作用,因为(.*)匹配 last 之后的所有内容\,所以没有什么可以被视为负前瞻输入。

于 2013-09-12T09:02:50.797 回答