c/fe

http://d.hatena.ne.jp/uzulla から移行しました。

Docomo+xhtmlだとアンカータグがウザい件。

いや初めて知ったんですが、Docomoxhtmlだと、ページ内リンクが以下の書き方だと動かないんですね。

<a href="#a">goto a</a>
hogehoge
<a name="a"></a>

なんと指定先として、nameプロパティじゃなく、idプロパティを使わないといけないという。

<a href="#a">goto a</a>
hogehoge
<a id="a"></a>

まあ、これならこういう風に書けばいいじゃん、って思うんですが、

<a href="#a">goto a</a>
hogehoge
<a id="a" name="a"></a>

これはコレでauで問題があるらしいですよ!(事実確認してませんが)アホか!

さらに、個人的な理由として、MceEditorでアンカーを指定すると、nameにしか入れてくれないので(まあ普通そうだよね)、これをどうにかせんといかん、ということで。


まあ、やる事は、aTagの時だけ、idとnameを入れ替えるだけの簡単なお仕事ですけど、これは正規表現で書く場合、例外を考えると死ねる。
ということで、最近好きなPHPでのDOM操作でやりました。

$content = 'ここにHTMLがあるとおもえばいいよ';

$errbefore = error_reporting();//DomDocument はエラーをだしまくるので、一時的にオフ
error_reporting(0);

//DOM オブジェクト作成
$document = new DOMDocument();
$document->recover = 1;
$document->loadHTML($content);

//DOM エレメント取得
$elms = $document->getElementsByTagName('a');

//エレメントをグルグル処理
foreach($elms as $elm) {
     if( $elm->hasAttribute('name') ) { // name プロパティが指定されていれば
         $elm->setAttribute('id', $elm->getAttribute('name')); //IDにつっこんで、
         $elm->removeAttribute('name'); // nameプロパティを消す。
     }
}

//元の変数にHTMLを書き戻す
$content = $document->saveHTML();

error_reporting($errbefore);// エラーレポートを復活

こんなコードで変換したらどうか、という話でした。