誰か助けてもらえますか?
URLの最初の2つのセグメントを取得したいのですが、たとえばURLは次のようになります。
/catalog/category-1
また
/catalog/category-1/filter/value
私の現在の正規表現は次のようになります...
/(\/catalog\/.*?)\//
これは長いURLでは機能しますが、最初の例では機能しません。
試す
$url = explode('/', trim($url, '/'));
$first_segment = $url[0];
$second_segment = $url[1];
編集:コメントで@Crispが指摘したように、空のfirst_segmentを防ぐために、そのtrim
前にあなたの文字列explode
。
URLの解析に正規表現を使用しないでください。組み込みparse_url()
関数を使用します。
その関数からパスコンポーネントを取得したら、このexplode()
関数を使用して、スラッシュに基づいてURLの一部を分割できます。
<?php
$url = "http://example.com/this/that/other?page=1";
$parts = parse_url($url);
print 'Parts = ';
print_r($parts);
print 'Path = ' . $parts['path'] . "\n";
$path_components = explode( '/', $parts['path'] );
print "Path components = ";
print_r( $path_components );
?>
それはあなたにこれを与えます:
Parts = Array
(
[scheme] => http
[host] => example.com
[path] => /this/that/other
[query] => page=1
)
Path = /this/that/other
Path components = Array
(
[0] =>
[1] => this
[2] => that
[3] => other
)
Regex
他の人が指摘しているように、この場合は最適なツールではありませんが、ここでは を使用していregex
ます。
あなたの問題は、regex
three を一致させようとしていることです/
。代わりに否定を使用してください。
$str1='/catalog/category-1';
$str2='/catalog/category-1/filter/value';
preg_match('#/[^/]*/[^/]*#',$str1,$match);
echo $match[0].;
preg_match('#/[^/]*/[^/]*#',$str2,$match);
echo $match[0];
出力:
/catalog/category-1
/catalog/category-1
説明:
/ # Match first /
[^/]* # Match anything not a /
/ # Match second /
[^/]* # Match anything not a /
まず、parse_url を使用して、URL をホスト、ポート、パス、およびクエリ文字列に分割します。
次に、パスで次の正規表現を使用します。
<?php
preg_match('#^/([^/]+)/([^/]+)#i', $path, $matches);
?>