2012-01-04 73 views
2

我想舍去开头的斜线和从URL查询字符串,但不能工作如何做这两个动作。我有这样的代码,完全适用于剥离查询字符串,但它留下的斜线的preg_replace剥离斜线

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

如果我的网址是www.mysite.com/myPage?querystring=123,上面给我留下了/myPage。我怎样才能调整这个,所以我可以删除主要的斜杠呢?

而且,你能指出我在一个资源来帮助我了解preg_replace模式匹配吗?

+0

为什么不干脆用http://uk.php.net/manual/en/function.parse-url。 PHP和字符串函数,如http://uk.php.net/manual/en/function.trim.ph p – 2012-01-04 18:10:31

+1

**这可能不是一个工作,正则表达式,但对于您所选择的语言现有的工具。**的正则表达式是没有魔杖,你挥手,恰好涉及字符串的每一个问题。您可能想要使用已经编写,测试和调试的现有代码。 在PHP中,使用['parse_url'](http://php.net/manual/en/function.parse-url.php)函数。 的Perl:['URI'模块(http://search.cpan.org/dist/URI/)。 红宝石:['URI'模块(http://www.ruby-doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI.html)。 .NET:“URI”类](http://msdn.microsoft.com/en-us/library/txt7706a.aspx) – 2013-06-08 14:02:40

回答

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

UPDATE

我想我应该回答的问题,虽然...所以在这种情况下实际上使用正则表达式...

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

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

最后,我们的替换只是简单地指定$1,以引用我们用原始括号将([^\?]+)归类的文本。其他

有一点要注意的是正则表达式新手往往没有意识到的是,你是不是需要使用/为模式分隔符。在这种情况下,我们使用其他的东西(比如大括号)来匹配实际的正斜杠字符。

我通常指向正则表达式初学者this link帮助他们上手。

更新2

上述正则表达式假设存在始终将是一个查询字符串,所以没有一个,(例如,/All-Products)如果你对一个URI跑起来,那正则表达式不起作用。为了说明这一点,只需改变你的模式,使查询字符串可选:

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

- 或 -

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

感谢您的帮助,但它仍保留着斜线我。我试过这段代码 - 对不起,我不知道如何格式化它! $ address = $ _SERVER ['REQUEST_URI']; $ pattern ='{^ /?([^ \?] +)\?。* $}'; $ replace ='$ 1'; $ address = preg_replace($ pattern,$ replace,$ address); echo $ address; – Damian 2012-01-04 18:49:53

+0

嗯,我必须错过一些东西,因为看起来你的答案与我原来的代码产生了完全相同的结果。感谢您的链接,以正则表达式页面,虽然,它应该证明是有用的:) – Damian 2012-01-04 19:24:09

+0

还好吧,既然你已经尽力使其对自己的工作,我会帮助,如果你可以让我知道'回声$ _ SERVER [输出'REQUEST_URI'];' – rdlowrey 2012-01-04 19:27:18

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
英语

末,“删除第一个字符,如果它是一个斜线还是一个问号,包括问号” 的?后任何具有特殊的意义,从而不得不进行转义\?