Mar 08, 2009

テキストモードでのURL自動リンクの挙動

ポスト @ 20:55:11 | Geeklog

テキストモードでURLを記述すると、リンク文字列がサーバ名だけになる妙な現象

例えば、テキスト中に http://www.izumichan.com/goingout/tour.html と書くと、これが自動リンクに変換されるんですが、リンク文字列が www.izumichan.com とかになってしまうっていう非常にわけわからん現象。

これは lib-common.php の関数 COM_makeClickableLinks() の挙動です。
Geeklog では、編集した記事はそのままDBに保存されず、なぜかこの関数に通して、リンクを生成した状態で保存されてしまいます。それを再編集する場合、COM_undoClickableLinks() を通してこれを素のURLに戻してからフォームのテキストエリアに書き出されます。
後者は、単に<a>タグのhref属性を取り出すだけの仕様ですので、前者を直せばよいです。

//$text = preg_replace( $regex, '<a href="\\1\\5">\\6</a>', $text );
$text = preg_replace( $regex, '<a href="\\1\\5">\\0</a>', $text );
直前の正規表現の6番めのグループはまさに「ドメイン名」なので、それを「URLとしてマッチした全体」にすることで、元のURLが全部表示されるようにできます。
もちろん、既に保存されている記事にはこの規則は適用されないので、再度編集画面を開いて即保存、を繰り返さなければ修正はされません。

はてなダイアリーの記事へのリンクがおかしくなる

まさに前項の元になっている正規表現のミス。サブドメイン名が2文字以上ないとマッチしないので、d. の部分がURLとして認識されないっていうドタコミス。

//$regex = '/((ht|f)tp(s?)\:\/\/|~\/|\/)?([\w]+:\w+@)?(([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?((\/?\w+\/)+|\/?)([\w\-%]+(\.[\w]{3,4})?)?((\?|&|&)[\w\-%]+=[\w\-%]+)*)/is';
$regex = '/((ht|f)tp(s?)\:\/\/|~\/|\/)?([\w]+:\w+@)?(([a-zA-Z]{1}([\w\-]*\.)+([\w]{2,5}))(:[\d]{1,5})?((\/?\w+\/)+|\/?)([\w\-%]+(\.[\w]{3,4})?)?((\?|&|&)[\w\-%]+=[\w\-%]+)*)/is';//yizumi 20090308 for hatena sub domain

Trackback

No Trackbacks

Track from Your Website

http://blog.izumichan.com/trackback/tb.php?id=642

Comment

No Comments

Post Your Comment


*は入力必須です。E-Mailは公開されません。