preg_replace用于去除前导斜杠

时间:2012-01-04 18:08:02

标签: php regex

我想从URL中删除前导斜杠和查询字符串,但无法解决如何同时执行这两项操作的问题。我有这个代码,它完美地用于剥离查询字符串,但它留下了前导斜杠

preg_replace('/\?.*$/', '', $_SERVER['REQUEST_URI'])

如果我的网址为www.mysite.com/myPage?querystring=123,则上面会留下/myPage。我怎么能调整这个以便我也可以删除主要的斜杠?

另外,您能指点我一个资源来帮助我理解preg_replace模式匹配吗?

2 个答案:

答案 0 :(得分:7)

在这么简单的情况下,我可能更喜欢PHP的简单字符串函数而不是正则表达式:

$addr  = ltrim($_SERVER['REQUEST_URI'], '/'); // zap a leading slash
$q_pos = strpos($addr, '?'); // get the string position of a '?'
$addr  = $q_pos !== FALSE ? substr($addr, 0, $q_pos) : $addr; // pull out URI

PHP的strpos()docs返回一个整数值,因此$q_pos === 0可能......这就是我们检查$q_pos !== FALSE的原因。

<强>更新

我想我应该回答这个问题,但是......所以在这种情况下实际使用正则表达式...

$address = '/test/url/test.php?extra';
$pattern = '{^/?([^\?]+)\?.*$}';
$replace = '$1';
$address = preg_replace($pattern, $replace, $address);
echo "$address"; // outputs: test/url/test.php

这是如何工作的?嗯...我们的模式使用括号指定捕获组([^\?]+),这些括号在可选正斜杠/?之后抓取所有内容,直到第一次出现可选< / em> \?在字符串中。请注意,我们使用反斜杠转义实际的问号字符,因为它在正则表达式模式的上下文中有意义。正则表达式模式.*的最后一部分只是将零个或多个字符匹配到字符串的末尾。

最后,我们的替换只是指定$1来引用我们使用原始括号分组([^\?]+)捕获的文字。

另外需要注意的是,正则表达式新手经常没有意识到你不是必需使用/作为模式分隔符。在这样的情况下,我们匹配实际的正斜杠字符,我使用其他东西(如花括号)。

我通常将正则表达式初学者指向this link以帮助他们开始。

更新2

上面的正则表达式假设总是会有一个查询字符串,所以如果你遇到没有一个的URI(例如,/All-Products),那个正则表达式将不起作用。为了解决这个问题,只需更改模式以使查询字符串可选:

$pattern = '{^/?([^\?]+)(?:\?.*)?$}'; // use an optional non-capturing group

-OR -

$pattern = '{^/?([^\?]+)\??.*$}'; // make the escaped ? optional

答案 1 :(得分:0)

$addr = preg_replace('{^/}','',$_SERVER['REQUEST_URI']);//removes leading slash
list($path) = explode('?',$addr);//removes query string
var_dump($path);

$path = preg_replace('{^/|\?.*}','',$_SERVER['REQUEST_URI']);

解释

  • {starting delimeter
  • ^ /匹配第一个字符(如果是) 斜线
  • |或
  • \?。*匹配文字问号,后跟零或 更多字符,直到字符串结尾
  • } ending delimeter

英文,“删除第一个字符,如果它是斜线或任何问题后面的问号,包括问号” ?具有特殊含义,因此必须进行转义\?