私はこのような単純な場合には正規表現の上に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
\?
をエスケープする必要がありますので、特別な意味を持っています。 phuk、そしてhttp://uk.php.net/manual/en/function.trim.phのような文字列関数p –**これは正規表現の仕事ではないかもしれませんが、あなたの言語の既存のツールのための仕事かもしれません。**正規表現は、文字列に関係するあらゆる問題で波動する魔法の杖ではありません。すでに書かれ、テストされ、デバッグされた既存のコードを使用したいと思うかもしれません。 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] –