我真的不知道最近我的问题是什么,但正则表达式似乎给了我最大的麻烦。
我需要做的很简单,但似乎无法得到它:
我有一个uri,它返回/ xmlfeed或/ xmlfeed / what / is / this
我想在任何场合匹配/ xmlfeed。
我尝试了以下几种变体:
preg_match('/(\/.*?)\/?/', $_SERVER['REQUEST_URI'], $match);
我会把它读作:匹配forwardslash然后匹配任何角色,直到你来到可选的forwardslash。
答案 0 :(得分:2)
为什么你需要让你困惑的正则表达式?
$string = "/xmlfeed/what/is/this";
$s = explode("/",$string,3);
print "/".$s[1]."\n";
输出
$ php test.php
/xmlfeed
答案 1 :(得分:2)
为什么不:
preg_match ('#/[^/]+#', _SERVER['REQUEST_URI'], $match);
$match[0]
将为您提供所需
答案 2 :(得分:1)
在PHP中:'/(\/.*?)\/?/'
是一个包含正则表达式的字符串。
首先,你必须解码字符串:/(/.*?)\/?/
所以你有一个正斜杠来启动结果表达式。开口支撑。一个正斜杠,它结束了表达式的匹配部分...而且我很确定它会因为你没有关闭括号而出错。
所以,为了让这个工作:
/
与反斜杠\
你希望匹配第一个斜杠之后的所有内容,但是在任何(可选的)第二个斜杠之前(因此我们不希望?
使其变得非贪婪):
/(\/[^\/]*)/
其中,表示为PHP字符串:
'/(\\/([^\\/]*)/'
答案 3 :(得分:1)
你的问题是不情愿的量词。匹配初始斜杠后,.*?
将消耗允许的最小字符数,即零。然后/?
接管;它没有在下一个位置看到一个斜线(紧接在第一个斜线之后),但这没关系,因为它是可选的。结果:正则表达式始终匹配单个斜杠,组#1始终匹配空字符串。
显然,你不能只用贪婪的量词取代不情愿的量词。但是,如果用不匹配斜杠的东西替换.*
,则不必担心贪婪。这就是 K Prime 的正则表达式,'#/[^/]+#'
。请注意它如何使用#
作为正则表达式分隔符,并避免在正则表达式中转义斜杠的必要性。
答案 4 :(得分:0)
我知道这是避免使用正则表达式,因此避免了这个问题,但是如何将uri(斜杠)拆分成数组。
然后你可以处理数组的元素,并忽略你不想要的uri位。
答案 5 :(得分:0)
使用发布的建议,我最终尝试了这个:
echo $_SERVER['REQUEST_URI'];
preg_match("/(\/.*)[^\/]/", $_SERVER['REQUEST_URI'], $match);
$url = "http://".$_SERVER['SERVER_NAME'].$match[0];
foreach($match as $k=>$v){
echo "<h1>$k - $v</h1>";
}
我也尝试过没有。*且没有括号。
如果没有。* AND(),它只返回/和下一个字符。
就像它一样,它只是每次都返回整个URI
因此,当使用上面的代码运行时,输出是
/tea-time-blog/post/20
0 - /tea-time-blog/post/20
1 - /tea-time-blog/post/2
顺便说一下,这段代码是eval()。我不认为这会对PHP处理正则表达式的方式产生任何不同。