下記URLのタグの正規表現を流用して作りました(SGMLの省略タグ機構は無視できるので一部変更)
$array = preg_split('/(<[^\x22\x27<>]*(?:\x22[^\x22]*\x22[^\x22\x27<>]*|\x27[^\x27]*\x27[^\x22\x27<>]*)*>)/',$xml,-1,PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
要素内容に<,>を含まないwell-formedなXMLという前提です.
速度については,preg_match_all()で同様のコトをするよりもpreg_split()の方が速いのは確認済みです.
正規表現を使わず,while ($i < strlen($xml)) で逐次解析する方法も思い浮かびますが,「正規表現」をつかってとのことなのでこんなもんではないでしょうか.
不勉強ですが,XMLで属性値内に<,>を含めないのであれば,正規表現は<[^>]+>で十分です.一応書いておくと
$array = preg_split('/(<[^>]+>)/',$xml,-1,PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
ですね
書いて頂いたコードを応用して実際に試してみました。PHPパーサ関数よりだいぶ早くなりました。ありがとうございました。