我可能有利於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