久しぶりに何かお客様から依頼されてモノを作りたくなったので、ちっちゃいところからやり直そうと言うことで正規表現を作成代行してみようと思います。
あまりにも複雑な正規表現パターン(たとえば、規約どおりのメールアドレスのパターンとか)じゃ無ければ作りますので、良かったらオーダーしてみてください。
→依頼ページ:正規表現についての簡単なものを作成します!
□依頼時の注意点
・料金は一つの依頼につき500円です。
・処理対象テキストデータを送ってもらいます。
たとえばHTML、Aタグのhref属性を取得したいなら具体的なAタグのテキストを複数ください。
・処理内容の具体的な内容
たとえば、XMLデータならどのタグの要素が欲しい、とか書いてください。
□依頼してからパターンが納品される日数
・簡単なものなら1日、比較的複雑なもので2~3日程度で納品します。
・パターン個数は基本的に1つの依頼で1つにしようと思っています。
以上です。それでは。
2013-10-21
2013-10-05
【青空文庫】青空文庫のXMLをパースしてみた
【青空文庫】青空文庫のXMLをパースしてみた
自分の読書用に青空文庫に掲載してあるXMLをパースしてみたよ。
青空文庫のXMLは仕様通りにキッチリ書いてあるものと、そうでないものがあり、ちょっと苦労した。
以下のクラスは基本的に「大見出し」と「中見出し」で区切って配列にして返すものだけど、面倒な処理は正規表現やexplodeでばっさり切り分けたりしてます。
---
このクラスを使って小説を転載したものは、以下のサイトで読めます。
・多賀城[たがのき]小説投稿サイト
良かったら見てくださいませ。
---
青空文庫のXMLは仕様通りにキッチリ書いてあるものと、そうでないものがあり、ちょっと苦労した。
以下のクラスは基本的に「大見出し」と「中見出し」で区切って配列にして返すものだけど、面倒な処理は正規表現やexplodeでばっさり切り分けたりしてます。
---
このクラスを使って小説を転載したものは、以下のサイトで読めます。
・多賀城[たがのき]小説投稿サイト
良かったら見てくださいませ。
---
/* * 青空文庫XMLパーサ * 2013/10/01 */ class Aozora { const FROM_ENCODING = 'sjis-win'; const TO_ENCODING = 'UTF-8'; public $filename; public $title; public $author; /* 本文の階層構造 大見出しがある場合 bodies = array( '大見出し_01' => array( '中見出し_01' => '本文', '中見出し_02' => '本文', ... '中見出し_nn' => '本文' ), '大見出し_02' => array( '中見出し_01' => '本文', '中見出し_02' => '本文', ... '中見出し_nn' => '本文' ), '大見出し_03' => array( '中見出し_01' => '本文', '中見出し_02' => '本文', ... '中見出し_nn' => '本文' ), ... '大見出し_nn' => array( '中見出し_01' => '本文', '中見出し_02' => '本文', ... '中見出し_nn' => '本文' ) ); 大見出しが無い場合 bodies = array( '中見出し_01' => '本文', '中見出し_02' => '本文', ... '中見出し_nn' => '本文' ); */ public $bodies; public $infomation; // 小説情報 public $notes; // 注 public $is_omidasi; public $is_tyumidasi; private $raw_text; private $main_text; private $biblio; public function __construct( $filename ) { $this->filename = $filename; $this->raw_text = file_get_contents( $this->filename ); $this->raw_text = mb_convert_encoding( $this->raw_text, self::TO_ENCODING, self::FROM_ENCODING ); $this->bodies = array(); } public function get_title() { return sprintf( '%s (作者:%s)', $this->title, $this->author ); } public function get_bodies() { return $this->bodies; } /** XMLパース本体 */ public function parse() { // 改行を全て消す $this->raw_text = preg_replace( '#[\n\r]+#i', '', $this->raw_text ); $this->raw_text = preg_replace( '#[\s]+#i', ' ', $this->raw_text ); // タイトルと著者を取得する $ret = preg_match( '#(.*?)
#i', $this->raw_text, $temp_text ); $this->title = $this->replace_imgtag( $temp_text[ 1 ] ); $this->title = trim( $this->title ); $ret = preg_match( '#(.*?)
#i', $this->raw_text, $temp_text ); $this->author = $this->replace_imgtag( $temp_text[ 1 ] ); $this->author = trim( $this->author ); // 付加情報を取得する $ret = preg_match( '#(.*?)#i', $this->raw_text, $temp_text ); $this->infomation = $this->remove_htmltag( $temp_text[ 1 ] ); $this->infomation = $this->add_return( $this->infomation ); $this->infomation = trim( $this->infomation ); // 本文を全て取得する $ret = preg_match( '#(.*)#i', $this->raw_text, $temp_text ); $this->main_text = trim( $temp_text[ 1 ] ); // 大見出しから切り出し $this->parse_omidasi(); } /* 大見出しがある場合の本文切り出し */ private function parse_omidasi() { if( $this->is_omidasi( $this->main_text ) ) { // 大見出しがある場合 $temp_text = explode( '', $this->main_text ); foreach( $temp_text AS $temp ) { if( trim( $temp ) == "" ) { continue; } if( !$this->is_omidasi( $temp ) ) { continue; } $ret = preg_match( '#(.*?)
(.*)$#', $temp, $temp_omidasi ); $omidasi = $this->remove_htmltag( $temp_omidasi[ 1 ] ); $omidasi = $this->replace_imgtag( $omidasi ); $omidasi = trim( $omidasi ); $this->bodies[ $omidasi ] = $this->parse_tyumidasi( $temp_omidasi[ 2 ] ); } } else { // 大見出しがない場合 $this->bodies[] = $this->parse_tyumidasi( $this->main_text ); } } /* 中見出しから本文切り出し @param $html 大見出し1つ分のテキスト または 本文全体のテキスト */ private function parse_tyumidasi( $html ) { $tyumidasi_array = array(); if( $this->is_tyumidasi( $html ) ) { $temp_text = explode( '', $html ); foreach( $temp_text AS $idx => $temp ) { if( trim( $temp ) == "" ) { continue; } if( !$this->is_tyumidasi( $temp ) ) { continue; } $ret = preg_match( '#(.*?)
(.*)$#', $temp, $temp_tyumidasi ); $tyumidasi = $this->remove_htmltag( $temp_tyumidasi[ 1 ] ); $tyumidasi = $this->replace_imgtag( $tyumidasi ); $tyumidasi = trim( $tyumidasi ); $tyumidasi_array[ $tyumidasi ] = $this->remove_htmltag( $temp_tyumidasi[ 2 ] ); $tyumidasi_array[ $tyumidasi ] = $this->replace_imgtag( $tyumidasi_array[ $tyumidasi ] ); $tyumidasi_array[ $tyumidasi ] = $this->add_return( $tyumidasi_array[ $tyumidasi ] ); } } else { $tyumidasi_array[ 1 ] = $this->remove_htmltag( $html ); $tyumidasi_array[ 1 ] = $this->replace_imgtag( $tyumidasi_array[ 1 ] ); $tyumidasi_array[ 1 ] = $this->add_return( $tyumidasi_array[ 1 ] ); } return $tyumidasi_array; } /* 大見出しがあるかどうか */ private function is_omidasi( $html ) { $ret = substr_count( $html, '' ); if( $ret > 0 ) { $this->is_omidasi = true; } else { $this->is_omidasi = false; } return $this->is_omidasi; } /* 中見出しがあるかどうか */ private function is_tyumidasi( $html ) { $ret = substr_count( $html, '' ); if( $ret > 0 ) { $this->is_tyumidasi = true; } else { $this->is_tyumidasi = false; } return $this->is_tyumidasi; } /* 余分なHTMLタグを除去する */ private function remove_htmltag( $text ) { return preg_replace( '#<(?:|/)(?:em|div|span|a|h3|h4|hr)[^>]*>#', '', $text ); } /* 画像タグを置き換える */ private function replace_imgtag( $text ) { return preg_replace( '#]+>#', "$1", $text ); } /* * 改行を元に戻す */ private function add_return( $text ) { return preg_replace( '#
]+>#', "\r\n", $text ); } }
以上です。
2013-09-17
【銀の匙視聴記念】帯広市のこと
管理人が小学生の頃、親の転勤により帯広市に4年間ほど住んでました。
帯広市が舞台になっている農業アニメ「銀の匙」を見たので、記念に自分が気に入っている帯広市のことを少し紹介してみます。
※ただ、自分が帯広市に住んでいたのは20年以上前のことなので今と状況が大分違うことをご了承ください。
・Wikiの帯広市
・デカイ公園:緑ヶ丘公園
帯広市の中心部近くに広さ50ヘクタール以上の大きさの「緑ヶ丘公園」っていう公園?があります。
とんでもなくでかいので、公園の中の林などにリスが住んでいたりします。
自分がすきなのは8ヘクタールほどの面積の何も無い空間である「グリーンパーク」という原っぱですね。400メートルのつながったベンチがあります。
公園の中には動物園と遊園地を合体させたような施設があり、「おびひろ動物園」と呼ばれています。小学生のとき動物の名付け親になったこともありますw
緑ヶ丘公園:http://www.city.obihiro.hokkaido.jp/toshikensetsubu/midorinoka/a_01midorigaoka.html
グリーンパーク:http://www.obihiromap.com/advance.php?code=110260
・スピードスケート
帯広市には国際大会が開かれるようなスピードスケートリンクがあったりするので、市全体でスピードスケートが盛んです。
十勝平野にあるので、地面が平らで基本土地が余っているために学校の校庭もデカイ(管理人が通っていた小学校の校庭は1ヘクタールあった)。よって、冬にはスキーじゃなくスピードスケートが体育の授業です。
雪が降ったら、地元のPTAの方やボランティアの方たちが毎日雪の上に放水して手作りのスピードスケートリンクを作ってくれます。
児童生徒たちはmyスケート靴を毎日学校にもって行き、体育では習熟度別クラスでのスケート授業、放課後はスケートで遊び足の感覚を無くして帰ってくるという毎日です。
・お菓子
帯広市にはお菓子屋さんがいっぱいあって、「六花亭(マルセイバターサンド)」「柳月(三方六:バウムクーヘン)」「クランベリー(スイートポテト)」が有名。
六花亭の喫茶室にはそこでしか食べられないお菓子が売られています。自分は「ひとつ鍋」という求肥が入った最中が好きです。
ちなみにマルセイバターサンドの「マルセイ」とは、帯広の開拓民である依田勉三が結成した会社「晩成社」で作られていたバターのラベルに記されている記章からきています。
六花亭:六花亭
柳月:柳月
クランベリー:クランベリー
・帯広農業高校/帯広畜産大学
この二つの学校は道路を挟んで並んで存在しています。
そのどちらも敷地面積がデカく、校舎から実習農場まで行くのに授業に遅刻するレベル。すごいね。
昔、親御さんに連れられて鉢植えを買いに行ったことがあります。
とりあえず以上です。
2013-09-16
【PHPで画像処理】ガンマ補正を行うクラス
自分で撮った写真や画像の明るさを偏向するのに便利なのがガンマ補正なのですが、映像からキャプチャした連続画像などを手で補正するのがダルいわけです。 そこで、ちょこっとPHPで組んでみました。
ちなみにガンマ補正とは、画像の「暗すぎ」とか「明るすぎ」というものを補正するのが目的の画像処理のことです。 Windows用のディスプレイはガンマ補正値が「2.2」となっているそうです。
ちなみに、以下にプログラムを使って編集した画像を載せてみます。
1枚目が元画像、2枚目が補正値0.5のもの(暗くしたもの)、3枚目が補正値2.0のもの(明るくしたもの)です。
ちなみにガンマ補正とは、画像の「暗すぎ」とか「明るすぎ」というものを補正するのが目的の画像処理のことです。 Windows用のディスプレイはガンマ補正値が「2.2」となっているそうです。
/* * ガンマ補正用クラス */ class Gamma { private $image; // 入力画像リソース private $new_image; // 出力画像リソース private $size_x; private $size_y; /** コンストラクタ @param $image 入力画像のリソース */ public function __construct( $image ) { $this->image = $image; $this->size_x = imagesx( $this->image ); $this->size_y = imagesy( $this->image ); $this->new_image = imagecreatetruecolor( $this->size_x, $this->size_y ); } /** デストラクタ */ public function __destruct() { imagedestroy( $this->image ); } /** 変更後の画像リソース取得 @return 画像リソース */ public function get_image() { return $this->new_image; } /** 出力用画像リソースを新しく作成する */ public function renew_image() { unset( $this->new_image ); $this->new_image = imagecreatetruecolor( $this->size_x, $this->size_y ); } /** ガンマ補正 @param $gamma ガンマ補正値 ※ 0 < $gamma <= 5 @return 成功:true 失敗:false */ public function gamma( $gamma ) { if( $gamma < 0 ) { return false; } if( $gamma > 5 ) { return false; } for( $x = 0 ; $x < $this->size_x ; $x += 1 ) { for( $y = 0 ; $y < $this->size_y ; $y += 1 ) { $this->culc_gamma( $x, $y, $gamma ); } } return true; } /* ガンマ補正用計算 */ private function culc_gamma( $x, $y, $gamma ) { $rgb = imagecolorat( $this->image, $x, $y ); $r = ($rgb >> 16) & 0xFF; $g = ($rgb >> 8) & 0xFF; $b = $rgb & 0xFF; $temp_gamma = 1 / $gamma; $r_base = $r / 255; $g_base = $g / 255; $b_base = $b / 255; $nr = (int)floor( 255 * pow( $r_base, $temp_gamma ) ); $ng = (int)floor( 255 * pow( $g_base, $temp_gamma ) ); $nb = (int)floor( 255 * pow( $b_base, $temp_gamma ) ); $nrgb = imagecolorexact( $this->image, $nr, $ng, $nb ); imagesetpixel( $this->new_image, $x, $y, $nrgb ); } }
ちなみに、以下にプログラムを使って編集した画像を載せてみます。
1枚目が元画像、2枚目が補正値0.5のもの(暗くしたもの)、3枚目が補正値2.0のもの(明るくしたもの)です。
2013-05-17
【周期表】化学で使う周期表暗記用シート作ってみた
とりあえず、水素からクリプトンまでの36個の元素を書込めるようにした暗記用シートを作ってみたよ。
いまさら「すいへいりーべ」とか唱えても仕方が無いので、このシートを1日1回やるだけで1週間か2週間で全部暗記できるはず。というか自分は出来ましたw
シートは3種類で、
1)元素記号を記入するもの
2)元素名を記入するもの
3)元素記号&元素名を記入するもの
となっています。
「元素記号&元素名を記入するもの」は他の2枚が完璧になった時点でやってもOKです。
下のリンクからダウンロードしてくださいね。
周期表暗記用シート(PDF)
それでは。
登録:
投稿 (Atom)