正则表达式匹配任何字符后面没有“?something”

时间:2013-09-12 08:56:39

标签: regex

如果没有“?”,我怎样才能匹配路径?最后加上零或多个字符。

我有以下路径:

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

我想要文件名,但只有在文件扩展名后没有“?something”时才会这样。

我试过了:

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

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

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

使用php。

4 个答案:

答案 0 :(得分:3)

使用parse_url

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

(
    [path] => /something/contentimg/coast03.jpg
    [query] => itok=ABC
)

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

这就是目前的匹配方式:

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

你应该做什么:

看起来您可以检查字符串中是否存在?,因此请尝试:

/^(?!.*\?)/

或者与最后一次/匹配,然后从那里检查?

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

<强>解释

您已经知道(?!...)是负面预测,您只是不完全确定如何使用它。无论你把它放在哪里,它都会尽力匹配从那个位置开始的给定模式。如果成功,则正则表达式不匹配。因此,最好将其置于最开始并尝试匹配其余字符串。

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

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

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

不应要求最后的.*$,如果要检查整个字符串,请记住预测结束时的$

/^(?!...$)/

答案 3 :(得分:0)

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

工作DEMO

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