2012-01-04 9 views
2

URLから先行スラッシュとクエリー文字列を取り除きたいが、その両方を行う方法を考えることができない。私は、クエリ文字列を除去するために完璧に動作し、このコードを持っていますが、私のURLが/myPageで私を残し上記、www.mysite.com/myPage?querystring=123である場合には、先頭のスラッシュpreg_replace先行スラッシュを取り除く

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

を残します。私はこれを微調整して先導スラッシュも取り除くことができますか?

また、preg_replaceのパターンマッチングを理解するのに役立つリソースを教えてください。

+0

\?をエスケープする必要がありますので、特別な意味を持っています。 phuk、そしてhttp://uk.php.net/manual/en/function.trim.phのような文字列関数p –

+1

**これは正規表現の仕事ではないかもしれませんが、あなたの言語の既存のツールのための仕事かもしれません。**正規表現は、文字列に関係するあらゆる問題で波動する魔法の杖ではありません。すでに書かれ、テストされ、デバッグされた既存のコードを使用したいと思うかもしれません。 PHPでは、['parse_url'](http://php.net/manual/en/function.parse-url.php)関数を使用してください。 Perl:['URI'モジュール](http://search.cpan.org/dist/URI/)。 Ruby:['URI'モジュール](http://www.ruby-doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI.html)。 .NET:['Uri' class] –

答えて

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 !== FALSEをチェックし、なぜそれが$q_pos === 0いる可能性があります...これがあります。

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になるように指導しています。上記

UPDATE 2

正規表現があり、常に、クエリ文字列であることを行っているので、あなたは、URIにぶつかる場合は、1つを持っていないこと、(例えば、/All-Products)、ということを前提としてい正規表現は機能しません。これを説明するために、単純にクエリ文字列をオプションにするために、あなたのパターンを変える:

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

- または -

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

ご協力ありがとうございますが、引き続きスラッシュを残しています。私はこのコードを試しました - 申し訳ありませんが、私はそれをフォーマットする方法を知らない! $ address = $ _SERVER ['REQUEST_URI']; $ pattern = '{^ /?([^ \?] +)\?。* $}'; $ replace = '$ 1'; $ address = preg_replace($パターン、$置換、$アドレス); echo $ address; – Damian

+0

あなたの答えが私の元のコードと全く同じ結果を生み出すと思われるので、何かが欠けているはずです。しかし、正規表現のページへのリンクをありがとう、それは有用であることを証明する必要があります:) – Damian

+0

Allright、あなた自身で動作させようとしたので、私に 'echo $ _SERVER [ 'REQUEST_URI']; ' – rdlowrey

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

の最後までゼロまたは 以上の文字が続くリテラルの疑問符に一致しますまたは疑問符」 ?含む疑問符の後は何も、単にhttp://uk.php.net/manual/en/function.parse-urlを使用しないのはなぜ

関連する問題