2012-01-04 77 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
英語

末,「刪除第一個字符,如果它是一個斜線還是一個問號,包括問號」 的?後任何具有特殊的意義,從而不得不進行轉義\?