※ ChatGPTを利用し、要約された質問です(原文:preg_match_allの 正規表現)
正規表現でXMLの要素を取得する方法
このQ&Aのポイント
preg_match_all関数を使用してXML内の特定の要素を取得する正規表現を作成する方法を教えてください。
質問文章に示された正規表現は、<category>タグの中の<item>要素のみを取得するため、完全な取得ができていません。
質問者は、.*?の処理の意味を理解しておらず、正規表現の結果に満足していません。
<root>
<Space>
<Id>2075028953</Id>
<Depth>2</Depth>
<Title>コンテスト</Title>
</Space>
<Category>
<Count>2</Count>
<Item>
<Id>2075028959</Id>
<Title>グルメ、ドリンク</Title>
</Item>
<Item>
<Id>2075028966</Id>
<Title>音楽</Title>
</Item>
</Category>
<Site>
<Item>
<Id>2078063954</Id>
<Title>建築</Title>
</Item>
</Site>
</root>
のようなXMLで、preg_match_allで<category>タグの中の複数ある<item>要素のあらゆる要素を取得する正規表現を教えてください。
次の正規表現はどこが間違っていますでしょうか。
preg_match_all('@<Category>.*?(<Item>.*?<Id>(?P<id>.*?)</Id>.*?<Title>(?P<title>.*?)</Title>.*?</Item>).*?</Category>@s',
$buf,$match,PREG_SET_ORDER);
print_r($match);
あるサンプル紹介サイトの真似をしただけでしたのでうまくいきませんでした。<category>タグ内の中身と、最初の<item>タグの中身しか取得できません。
だいたい.*?の処理の意味自体解っておりません。
恐縮ですが、よろしくお願いします。
お礼
いつもお世話になっております。 一気に個々のId,Titleが取れるのですね。 <Item>_______</item>のところをどう()で括って表現するか、いろいろ試していました。 ((?:________.*?)*?)とは。考えても思いつかなかったと思います。 xmlライブラリ関数は、次回の機会に習得したいです。 ありがとうございました。