fslashtの日記: /.日記のHTMLソースをPukiWiki形式に変換
日記 by
fslasht
STATUS: 故障中
/.の日記をベースにしてPukiWikiなどのページを作ろうとすると
改行の「~」入れたり、タグをPukiWiki形式に変換したりといろいろ
めんどくさいので、nisejournalに変換機能をつけてみました。
Pseudo Slashdot Journal あるいは 偽/.日記 ver.1.04 (開発版)
http://dokokano.net/~fslasht/misc/nisejournal/nisejournal.php
※このURLはまさに開発中のテスト環境です。
コードを書き換えてるときはちゃんと動かないと思います。
だいたい正規表現で置換とか出来ました。
ソースはこんな感じ。
$str = 日記のHTMLソース
$str = preg_replace( "/\r<br>/i","~\n",$str);
$str = preg_replace( "/\<BR>/","~\n",$str);
$arrPat = array();
$arrReplace = array();
$arrPat[]="/\<b\>/i"; $arrReplace[]="''";
$arrPat[]="/\<\/b\>/i"; $arrReplace[]="''";
$arrPat[]="/\<em\>/i"; $arrReplace[]="''";
$arrPat[]="/\<\/em\>/i"; $arrReplace[]="''";
$arrPat[]="/\<strong\>/i"; $arrReplace[]="''";
$arrPat[]="/\<\/strong\>/i"; $arrReplace[]="''";
$arrPat[]="/\<i\>/i"; $arrReplace[]="'''";
$arrPat[]="/\<\/i\>/i"; $arrReplace[]="'''";
$arrPat[]="/\<p\>/i"; $arrReplace[]="";
$arrPat[]="/\<\/p\>/i"; $arrReplace[]="";
$arrPat[]="/\<tt\>/i"; $arrReplace[]="";
$arrPat[]="/\<\/tt\>/i"; $arrReplace[]="";
$arrPat[]='/\<a[^\>]*href\=["|\']([^\>]*?)["|\'][^\>]*\>([^\<]*?)\<\/a\>/ise';
$arrReplace[]="'[['.preg_replace('/~\n/','','$2').':$1]]'";
$arrPat[]="/\<\/ol\>/i"; $arrReplace[]="</ol>\n"; // 予備改行
$arrPat[]="/\<\/ul\>/i"; $arrReplace[]="</ul>\n"; // 予備改行
$arrPat[]='/\<ol\>(.*?)\<\/ol\>/sie';
$arrReplace[]="preg_replace('/\<li\>/i','-','$1')";
$arrPat[]='/\<ul\>(.*?)\<\/ul\>/sie';
$arrReplace[]="preg_replace('/\<li\>/i','+','$1')";
$arrPat[]="/\<blockquote\>/i"; $arrReplace[]="<blockquote>\n"; // 予備改行
$arrPat[]='/\<blockquote\>(.*?)\<\/blockquote\>/sie';
$arrReplace[]="preg_replace(array('/\n/','/~/'),array('\n ',''),'$1')";
$str = preg_replace($arrPat , $arrReplace , $str );
このページを変換すると
http://srad.jp/journal.pl?op=display&uid=3370&id=191435
こんな感じになります。
http://www.dokokano.net/~fukaya/pukiwikitest/pukiwiki.php?test%2Fhtmlconv
いまのところ制限事項としては、以下のような感じです
・複数のテキストリンクは1行にまとまる(PukiWikiの制限)
・リストを1行にまとめで書いてしまうと正しく変換できない
例) <ol><li>リストb1<li>リストb2<li>リストb3</ol>
・<blockquote>した最後の行に余計な「~」が付いてしまう
・PukiWikiのマークアップと同一の文字が日記の文章に入っていた場合は、適用されてしまう。
ほかにもちょっとおかしなところがありますが、そこは手で
修正するとしても、かなり効率よく変換できると思います。
なんかもうわけわからなくなってますが、正規表現直せるところがあったらご指摘いただけると助かります。
preg_replaceのすごいところは、/e修飾子をつけると置換先に
PHPのコードを書くことができることです。
マッチしたそれぞれの文字列にたいして、文字列処理関数を
呼び出したりできるわけです。
preg_replaceを入れ子で呼ぶこともできてかなり強力。
でも、入れ子で呼んだ preg_replaceの中の正規表現で
括弧で括られたパターンにマッチしたテキストはどうやって
使ったらいいのでしょう? $1とかってやったら、おおもとの
preg_replaceのテキストと置換されちゃいそうだし。
/.の日記をベースにしてPukiWikiなどのページを作ろうとすると
改行の「~」入れたり、タグをPukiWiki形式に変換したりといろいろ
めんどくさいので、nisejournalに変換機能をつけてみました。
Pseudo Slashdot Journal あるいは 偽/.日記 ver.1.04 (開発版)
http://dokokano.net/~fslasht/misc/nisejournal/nisejournal.php
※このURLはまさに開発中のテスト環境です。
コードを書き換えてるときはちゃんと動かないと思います。
だいたい正規表現で置換とか出来ました。
ソースはこんな感じ。
$str = 日記のHTMLソース
$str = preg_replace( "/\r<br>/i","~\n",$str);
$str = preg_replace( "/\<BR>/","~\n",$str);
$arrPat = array();
$arrReplace = array();
$arrPat[]="/\<b\>/i"; $arrReplace[]="''";
$arrPat[]="/\<\/b\>/i"; $arrReplace[]="''";
$arrPat[]="/\<em\>/i"; $arrReplace[]="''";
$arrPat[]="/\<\/em\>/i"; $arrReplace[]="''";
$arrPat[]="/\<strong\>/i"; $arrReplace[]="''";
$arrPat[]="/\<\/strong\>/i"; $arrReplace[]="''";
$arrPat[]="/\<i\>/i"; $arrReplace[]="'''";
$arrPat[]="/\<\/i\>/i"; $arrReplace[]="'''";
$arrPat[]="/\<p\>/i"; $arrReplace[]="";
$arrPat[]="/\<\/p\>/i"; $arrReplace[]="";
$arrPat[]="/\<tt\>/i"; $arrReplace[]="";
$arrPat[]="/\<\/tt\>/i"; $arrReplace[]="";
$arrPat[]='/\<a[^\>]*href\=["|\']([^\>]*?)["|\'][^\>]*\>([^\<]*?)\<\/a\>/ise';
$arrReplace[]="'[['.preg_replace('/~\n/','','$2').':$1]]'";
$arrPat[]="/\<\/ol\>/i"; $arrReplace[]="</ol>\n"; // 予備改行
$arrPat[]="/\<\/ul\>/i"; $arrReplace[]="</ul>\n"; // 予備改行
$arrPat[]='/\<ol\>(.*?)\<\/ol\>/sie';
$arrReplace[]="preg_replace('/\<li\>/i','-','$1')";
$arrPat[]='/\<ul\>(.*?)\<\/ul\>/sie';
$arrReplace[]="preg_replace('/\<li\>/i','+','$1')";
$arrPat[]="/\<blockquote\>/i"; $arrReplace[]="<blockquote>\n"; // 予備改行
$arrPat[]='/\<blockquote\>(.*?)\<\/blockquote\>/sie';
$arrReplace[]="preg_replace(array('/\n/','/~/'),array('\n ',''),'$1')";
$str = preg_replace($arrPat , $arrReplace , $str );
このページを変換すると
http://srad.jp/journal.pl?op=display&uid=3370&id=191435
こんな感じになります。
http://www.dokokano.net/~fukaya/pukiwikitest/pukiwiki.php?test%2Fhtmlconv
いまのところ制限事項としては、以下のような感じです
・複数のテキストリンクは1行にまとまる(PukiWikiの制限)
・リストを1行にまとめで書いてしまうと正しく変換できない
例) <ol><li>リストb1<li>リストb2<li>リストb3</ol>
・<blockquote>した最後の行に余計な「~」が付いてしまう
・PukiWikiのマークアップと同一の文字が日記の文章に入っていた場合は、適用されてしまう。
ほかにもちょっとおかしなところがありますが、そこは手で
修正するとしても、かなり効率よく変換できると思います。
なんかもうわけわからなくなってますが、正規表現直せるところがあったらご指摘いただけると助かります。
preg_replaceのすごいところは、/e修飾子をつけると置換先に
PHPのコードを書くことができることです。
マッチしたそれぞれの文字列にたいして、文字列処理関数を
呼び出したりできるわけです。
preg_replaceを入れ子で呼ぶこともできてかなり強力。
でも、入れ子で呼んだ preg_replaceの中の正規表現で
括弧で括られたパターンにマッチしたテキストはどうやって
使ったらいいのでしょう? $1とかってやったら、おおもとの
preg_replaceのテキストと置換されちゃいそうだし。
/.日記のHTMLソースをPukiWiki形式に変換 More ログイン