0

私はいくつかのxmlタグを正規表現と一致させようとしています ここに私のphpコードがあります

   $pattern = '#<xt:tag_name *(type\="(.+?)")? *(detail\="(.+?)")? ?/>#ui';
   $str = '<xt:tag_name type="1" detail="2" />';
   preg_replace($pattern,"type: $1, detail: $4",$str);
   preg_match($pattern,$str,$m);
   print_r($m);

そして私は期待される結果を得ています

Array
(
    [0] => <xt:tag_name type="1" detail="2" />
    [1] => type="1"
    [2] => 1
    [3] => detail="2"
    [4] => 2
)

しかし、属性の順序を変更しているとき

<xt:tag_name detail="2" type="1" />

マッチは失敗する

4

1 に答える 1

3

説明

この正規表現は、属性がタグ内にある場合、属性の順序に関係なく属性typeをキャプチャします。detailxt:tag_name

<xt:tag_name\b(?=\s)(?=(?:(?!\>).)*\s\btype=(["'])((?:(?!\1).)*)\1)(?=(?:(?!\>).)*\s\bdetail=(["'])((?:(?!\3).)*)\3)(?:(?!\>).)*\>

ここに画像の説明を入力

拡張説明

  • <xt:tag_name\bタグ名を検証します
  • (?=\s)タグ名の後にスペースがあることを確認します
  • (?=の先読み 1 type。先読みを使用すると、属性を任意の順序で取得できます。
    • (?:(?!\>).)*一度に1文字ずつタグを移動し、到達するまで正規表現エンジンがこのタグを終了しないようにします
    • \s\btype=属性type
    • (["'])開始引用符をキャプチャします。これは後で適切な終了タグと一致させるために使用されます
    • ((?:(?!\1).)*)引用符内のすべての文字をキャプチャしますが、同じタイプのカプセル化された引用符は含まれません
    • \1近い引用符に一致
    • )の先読みを閉じるtype
  • (?=(?:(?!\>).)*\s\bdetail=(["'])((?:(?!\3).)*)\3)detailで行われたのとまったく同じことを名前付きの属性に対して行いますtype
  • (?:(?!\>).)*までのすべての文字に一致
  • \>タグの最後

グループ

グループ 0 には、開き括弧から閉じ括弧までのタグ全体が含まれます。

  1. 値の前後に開始引用符が含まれtypeます。これにより、正規表現が終了引用符に正しく一致することができます
  2. 属性からの値を持ちますtype
  3. 値の前後に開始引用符が含まれdetailます。これにより、正規表現が終了引用符に正しく一致することができます
  4. 属性からの値を持ちますdetail

PHP コード例:

入力文字列

<xt:tag_name UselessAttribute="some dumb string" type="1" detail="2" /><xt:tag_name detail="Things 'Punk' Loves" MoreUselessAttributes="1231" type="kittens" />

コード

<?php
$sourcestring="your source string";
preg_match_all('/<xt:tag_name\b(?=\s)(?=(?:(?!\>).)*\s\btype=(["\'])((?:(?!\1).)*)\1)(?=(?:(?!\>).)*\s\bdetail=(["\'])((?:(?!\3).)*)\3)(?:(?!\>).)*\>/ims',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

マッチ

$matches Array:
(
[0] => Array
    (
        [0] => <xt:tag_name UselessAttribute="some dumb string" type="1" detail="2" />
        [1] => <xt:tag_name detail="Things 'Punk' Loves" MoreUselessAttributes="1231" type="kittens" />
    )

[1] => Array
    (
        [0] => "
        [1] => "
    )

[2] => Array
    (
        [0] => 1
        [1] => kittens
    )

[3] => Array
    (
        [0] => "
        [1] => "
    )

[4] => Array
    (
        [0] => 2
        [1] => Things 'Punk' Loves
    )
)
于 2013-06-19T00:49:50.887 に答える