1

カテゴリ スラッグ、オプションのサブカテゴリ スラッグ、およびオプション アイテム スラッグで構成される URL を preg_match しようとしています。

4番目のケースを除いて、すべてのケースで機能します。

$urls[0] = '/main_cat_slug';
$urls[1] = '/main_cat_slug/';
$urls[2] = '/main_cat_slug/sub_cat_slug';
$urls[3] = '/main_cat_slug/sub_cat_slug/';
$urls[4] = '/main_cat_slug/item.html';
$urls[5] = '/main_cat_slug/sub_cat_slug/item.html';

$regexp   = array();
$regexp[] = '/(?:(?<category>[\w]+)/?)';    // Find the main category (is always available)
$regexp[] = '(?:(?<subcategory>[\w]+)/?)?'; // Find an optional sub-category, is not always available
$regexp[] = '(?:(?<item>[\w]+)\.html)?';    // Find an optional item, is not always available (don't catch the extension)
$regexp   = implode('', $regexp);

foreach($urls as $index=>$url) {
preg_match("#{$regexp}#i", $url, $matches);
echo '<pre><h1>', $index, '</h1>';
echo $url, '<br />';
echo '<br />';
print_r($matches);
}

4 番目のケースでは、カテゴリが見つかりますが、項目は空で、サブカテゴリは値 op "item" を取得します。

4番目のケースがカテゴリとアイテムのみを取得するように、誰かが私を助けてくれませんか?

上記のコードの出力は次のとおりです。

0
/main_cat_slug

Array
(
    [0] => /main_cat_slug
    [category] => main_cat_slug
    [1] => main_cat_slug
)

1
/main_cat_slug/

Array
(
    [0] => /main_cat_slug/
    [category] => main_cat_slug
    [1] => main_cat_slug
)

2
/main_cat_slug/sub_cat_slug

Array
(
    [0] => /main_cat_slug/sub_cat_slug
    [category] => main_cat_slug
    [1] => main_cat_slug
    [subcategory] => sub_cat_slug
    [2] => sub_cat_slug
)

3
/main_cat_slug/sub_cat_slug/

Array
(
    [0] => /main_cat_slug/sub_cat_slug/
    [category] => main_cat_slug
    [1] => main_cat_slug
    [subcategory] => sub_cat_slug
    [2] => sub_cat_slug
)

4
/main_cat_slug/item.html

Array
(
    [0] => /main_cat_slug/item
    [category] => main_cat_slug
    [1] => main_cat_slug
    [subcategory] => item
    [2] => item
)

5
/main_cat_slug/sub_cat_slug/item.html

Array
(
    [0] => /main_cat_slug/sub_cat_slug/item.html
    [category] => main_cat_slug
    [1] => main_cat_slug
    [subcategory] => sub_cat_slug
    [2] => sub_cat_slug
    [item] => item
    [3] => item
)

敬具!パトリック

4

2 に答える 2

1

説明

この正規表現は、次のルールを使用して 3 種類のデータを選択します。

  1. /常に文字列の最初の文字です
  2. Main_Cat は常に最初にあり、最初/に続き、次まで続きます。/
  3. 最初の文字列が で終わる場合、.html/これは Main_Cat です
  4. 最初の文字列が で終わり、.htmlその後に文字列の末尾が続く場合、これはアイテムです
  5. Sub_Cat は常に 2 番目であり、2 番目/に続き、次まで続きます。/
  6. 2 番目の文字列が で終わる場合、.html/これは Sub_Cat です
  7. 2 番目の文字列が で終わり、.htmlその後に文字列の末尾が続く場合、これはアイテムです
  8. Item タイプには常に.htmlサフィックスがあります
  9. /アイテムの後には決してありません
  10. アイテムタイプは常に最後のフィールドになります

^\/(?:(?<Main_Cat>(?![^\/\r\n]*\.html\s*$)[^\/\r\n]*)\/)?(?:(?<Sub_Cat>(?![^\/\r\n]*\.html\s*$)[^\/\r\n]*)\/)?(?:(?<Item>[^\/\r\n]*?)(?:\.html|$))?

ここに画像の説明を入力

個々の文字列に対してこの式を使用している場合は、改行文字を削除できます\r\n。結果の式は^\/(?<Main_Cat>[^\/]*)(?:(?:\/(?![^\/]*\.html)(?<Sub_Cat>[^\/]*))?(?:\/(?<Item>[^\/]*)\.html)?)?.*?$次のようになります: 上記と同じ規則に従います。行末により$、テストが文字列全体に一致するように強制されることに注意してください

PHP コード例:

ソース文字列

/category0.html/subcat/item.html
/item1.html
/category2.html/subcat2.html/item2.html
/category3.html/subcat3.html/
/category4.html/item4.html
/main_cat_slug5.html/
/main_cat_slug6/item6
/main_cat_slug7/sub_cat_slug7.html/
/main_cat_slug8/item8.html
/main_cat_slug9/sub_cat_slug9/item9.html

コード

<?php
$sourcestring="your source string";
preg_match_all('/^\/(?:(?<Main_Cat>(?![^\/\r\n]*\.html\s*$)[^\/\r\n]*)\/)?(?:(?<Sub_Cat>(?![^\/\r\n]*\.html\s*$)[^\/\r\n]*)\/)?(?:(?<Item>[^\/\r\n]*?)(?:\.html|$))?/imx',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

マッチ

$matches Array:
(
    [0] => Array
        (
            [0] => /category0.html/subcat/item.html
            [1] => /item1.html
            [2] => /category2.html/subcat2.html/item2.html
            [3] => /category3.html/subcat3.html
            [4] => /category4.html/item4.html
            [5] => /main_cat_slug5.html
            [6] => /main_cat_slug6
            [7] => /main_cat_slug7/sub_cat_slug7.html
            [8] => /main_cat_slug8/item8.html
            [9] => /main_cat_slug9/sub_cat_slug9/item9.html
        )

    [Main_Cat] => Array
        (
            [0] => category0.html
            [1] => 
            [2] => category2.html
            [3] => category3.html
            [4] => category4.html
            [5] => main_cat_slug5.html
            [6] => main_cat_slug6
            [7] => main_cat_slug7
            [8] => main_cat_slug8
            [9] => main_cat_slug9
        )

    [Sub_Cat] => Array
        (
            [0] => subcat
            [1] => 
            [2] => subcat2.html
            [3] => subcat3.html
            [4] => 
            [5] => 
            [6] => 
            [7] => sub_cat_slug7.html
            [8] => 
            [9] => sub_cat_slug9
        )

    [Item] => Array
        (
            [0] => item
            [1] => item1
            [2] => item2
            [3] => 
            [4] => item4
            [5] => 
            [6] => 
            [7] => 
            [8] => item8
            [9] => item9
        )


)
于 2013-06-14T02:58:35.810 に答える
0

これを試すことができます:

preg_match('~/(?<main_cat>[^/\s]++/?+)(?<sub_cat>[^/\s]++/?+)?'
         . '(?>(?<filename>\S+?)\.html)?~', $url, $match);
print_r($match);

名前付きキャプチャを使用すると、さまざまな部分に簡単にアクセスできることに注意してください (サブパターンがあるかどうかをテストするのに役立ちます)。

于 2013-06-14T08:00:53.640 に答える