3

誰か助けてもらえますか?

URLの最初の2つのセグメントを取得したいのですが、たとえばURLは次のようになります。

/catalog/category-1

また

/catalog/category-1/filter/value

私の現在の正規表現は次のようになります...

/(\/catalog\/.*?)\//

これは長いURLでは機能しますが、最初の例では機能しません。

4

4 に答える 4

7

試す

$url = explode('/', trim($url, '/'));
$first_segment = $url[0];
$second_segment = $url[1];

編集:コメントで@Crispが指摘したように、空のfirst_segmentを防ぐために、そのtrim前にあなたの文字列explode

于 2012-11-29T14:59:37.143 に答える
5

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
)
于 2012-11-29T14:56:31.283 に答える
1

Regex他の人が指摘しているように、この場合は最適なツールではありませんが、ここでは を使用していregexます。

あなたの問題は、regexthree を一致させようとしていることです/。代わりに否定を使用してください。

$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 /
于 2012-11-29T15:01:07.830 に答える
0

まず、parse_url を使用して、URL をホスト、ポート、パス、およびクエリ文字列に分割します。

次に、パスで次の正規表現を使用します。

<?php
preg_match('#^/([^/]+)/([^/]+)#i', $path, $matches);
?>
于 2012-11-29T14:59:51.040 に答える