記事一覧はこちら

ニコニコのコメントxmlにおける半角文字の実体参照について

直接ニコニコを触っている人にはお馴染みのコメントxmlファイル。その属性値と要素の値の半角文字の実体参照が少しおかしかったので纏めました。この記事の記号は全て全角にしていますが、もちろん実際は半角です。見た目が大きく変わるのでわかりにくいですが、上アンダーバー( ̄)はチルダ(~)の全角表記としています。
調べる半角文字は以下の30文字。この文字をニコニコ動画のコメント欄とメール欄に書き込んで送信。コメントxmlを受信してどの様に実体参照されているか調査。
!”#$%&’()*+,-./:;<=>?[¥]^_{|} ̄

結果。赤背景がエスケープされた文字です。

属性値 #$%’()*+,-./:;=>?[¥]^_{|} ̄
要素の値 !”#$%’()*+,-./:;?[¥]^_{|} ̄

要素の値(コメント本文)と属性値(メール欄)でエスケープ処理が異なります。手動でニコニコのxmlガリガリ処理している人はハマるので注意してください。自分はメール欄で>が実体参照されていると思い込んでコードを書いて、1年以上気付きませんでした。それだけメール欄に>を入れる奴が居ないという事ではあるけど。
ニコニコでの実体参照変換表

元の記号 実体参照された表記
"
&
<
>

phpでマッチさせる方法

//<chat mail=">" no="a>">コメン"ト例</chat>
preg_match('{<chat (.+?)>([^>]+)</chat>}',$chat,$match);
Array(
 [0] => <chat mail=">" no="a>">コメン"ト例</chat>
 [1] => mail=">" no="a>"
 [2] => コメン"ト例
)