如果没有“?”,我怎样才能匹配路径?最后加上零或多个字符。
我有以下路径:
/something/contentimg/coast03.jpg?itok=ABC
我想要文件名,但只有在文件扩展名后没有“?something”时才会这样。
我试过了:
/^.*\/(.*)(?!\?.*)$/
但无论如何它都匹配。这是结果。我做错了什么?
Array
(
[0] => /something/contentimg/coast03.jpg?itok=ABC
[1] => coast03.jpg?itok=ABC
)
使用php。
答案 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)