説明
この正規表現は、属性がタグ内にある場合、属性の順序に関係なく属性type
をキャプチャします。detail
xt: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 には、開き括弧から閉じ括弧までのタグ全体が含まれます。
- 値の前後に開始引用符が含まれ
type
ます。これにより、正規表現が終了引用符に正しく一致することができます
- 属性からの値を持ちます
type
- 値の前後に開始引用符が含まれ
detail
ます。これにより、正規表現が終了引用符に正しく一致することができます
- 属性からの値を持ちます
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
)
)