2011-09-16 9 views
0

正規表現を使用してXMLを解析するにはどうすればよいですか?PHPの正規表現を使用してXMLを解析する

のは、私たちは次のことを持っているとしましょう:

$string = '<z>1a<z>2b</z>3c<z>4d</z>5e</z>'; 
preg_match_all('/<z>(.+)<\/z>/', $string, $result_a); 
preg_match_all('/<z>(.+)<\/z>/U', $string, $result_b); 
preg_match_all($regex, $string, $result_x); 

私がいることを実行すると、$ result_aは、(配列の項目の中で)文字列を持っています:

'1a<z>2b</z>3c<z>4d</z>5e' 

また、変数$ result_bは配列の項目の中に文字列を持ちます:

'1a<z>2b' 
'4d' 

今、私はを望みますは配列の項目の中で別々に '2b'と '4d'を持ちます。

$regexはどうすればいいですか?

ありがとうございます!!!

答えて

3

使用非貪欲数量詞:

'/<z>(.+?)<\/z>/' 
    ___^ 

または負の文字クラスでドットを変更:

'/<z>([^z]+)<\/z>/' 

または

'/<z>([^<>]+?)<\/z>/' 

または、はるかに便利、使用xml parser

+0

この正規表現を使用すると、例で説明した2番目の正規表現と同じ結果が得られます。 – busce11

+0

@ busce11:私の編集された答えを見てください。 – Toto

+0

これは有効ですが、私はあらゆる種類のXHTMLタグである必要があります。抽象化の目的でzタグを使用してサンプルを投稿しましたが、zでは任意のタグを意味します。あなたの正規表現で2文字以上の名前に基づくタグを使用すると、名前タグを構成する文字が負の意味で一致し、名前タグは一致しません。 – busce11

3

Inこの場合は、あなたは非貪欲数量詞を使用するか、またはあなたは、この代替正規表現を使用することができます。

'/<z>([^<]+)<\/z>/' 

[^<]<以外のすべての文字をキャプチャします。

+0

申し訳ありませんが、私はそれを言うのを忘れました:タグの内容は< and >文字を含むことができます。 – busce11

関連する問題