正则表达式再次提问!

时间:2010-02-11 06:31:27

标签: php regex

我真的不知道最近我的问题是什么,但正则表达式似乎给了我最大的麻烦。

我需要做的很简单,但似乎无法得到它:

我有一个uri,它返回/ xmlfeed或/ xmlfeed / what / is / this

我想在任何场合匹配/ xmlfeed。

我尝试了以下几种变体:

preg_match('/(\/.*?)\/?/', $_SERVER['REQUEST_URI'], $match);

我会把它读作:匹配forwardslash然后匹配任何角色,直到你来到可选的forwardslash。

6 个答案:

答案 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处理正则表达式的方式产生任何不同。