我可能有利于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
为什么不干脆用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
**这可能不是一个工作,正则表达式,但对于您所选择的语言现有的工具。**的正则表达式是没有魔杖,你挥手,恰好涉及字符串的每一个问题。您可能想要使用已经编写,测试和调试的现有代码。 在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