Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?
こんにちは、久保田です。 皆さん正規表現は使っていますか? PHPに限らずどんな言語を使っていても、正規表現にお世話になっていないプログラマはいないと思います。しかし、その正規表現がどのように実装されているかについては知らない方が多いのではないのでしょうか。 この記事では、その正規表現エンジンの実装方法の一つである仮想マシンによる正規表現エンジンの実装方法を解説しつつ実際に簡単な正規表現エンジンを作っていきたいと思います。 正規表現エンジンの実装方法 正規表現エンジンの実装方法はいくつかあるのですが、それの一つに仮想マシンによって正規表現のマッチング処理を実行するやり方があります。PHPで利用している正規表現エンジンであるPCREはこの方式を採用しています。 仮想マシンによる実装方法は、正規表現というよりもプログラミング言語の実装方法の一つとして知られています。Rubyの最もメジャーな実装
できるだけ正確な記述を目指していますが、誤りがありましたら、お知らせ願います。 (最終更新: 2013/3/29 11:22) 正規表現の種類 まず、PHP には以下の 3種類の正規表現があります。 Perl 互換の正規表現 (pcre) mbstring の正規表現 (mbregex) POSIX 拡張正規表現 (regex) このうち、regex は バイナリセーフでない 日本語は扱えない PHP 5.3 で非推奨 なので使わない方がいいでしょう。見つけたら、随時 pcre か mbregex で書き直しましょう。 Perl 互換の正規表現 (pcre) 正規表現エンジンは Perl の「PCRE」 日本語は UTF-8 のみ扱える UTF-8 を使う場合は、パターン修飾子に u を指定する 文字クラスはロケールの影響を受ける PHP: 文字クラス - Manual 処理の制限値 (p
Unicode コンソーシアムの表によればU+3040~U+309F の範囲がひらがなとされている。ひらがなを直接パターンとして使うこともできるが、日本語のフォントが入っていない環境でも見る場合を考えると、Unicode 文字プロパティで集合として定義されている Hiragana、コードポイント、バイナリ表現などを使うほうがよいだろう。ちなみにカタカナをあらわす Katakana や漢字をあらわす Han は利用できなかった。 $s = 'ぁゝゞゟ'; var_dump( (bool) preg_match('/\A[ぁ-ゖゝ-ゟ]+\z/u', $s), (bool) preg_match('/\A\p{Hiragana}+\z/u', $s), (bool) preg_match('/\A[\x{3041}-\x{3096}\x{309D}-\x{309F}]+\z/u', $s),
さて問題です。次のコードの実行結果はどうなるでしょうか? <?php var_dump(preg_match('/\w/u', 'あ')); var_dump(preg_match('/\w/u', ' ')); // 全角スペース var_dump(preg_match('/\w/u', '1')); // 全角の1 var_dump(preg_match('/\d/u', '1')); // 全角の1 答え。 Linux ではこうなりました。 php-4.4.9: int(0) int(0) int(0) int(0) php-5.1.6: int(0) int(0) int(0) int(0) php-5.2.17: int(0) int(0) int(0) int(0) php-5.3.0: int(0) int(0) int(0) int(0) php-5.3.1: int(0)
ちょっと横長になるのが欠点ですが,ちょっとシンプルな感じです.キャプチャ対象が複数ある場合は以下のように書いたりします. <?php $result = preg_match('_<a href="(.*?)">(.*?)</a>_s', $html, $matches) ? array('link' => $matches[1], 'title' => $matches[2]) : false; preg_matchでのキャプチャをシンプルに | この先生きのこるには preg_matchではパターン文字列内の()で囲んだものが第3引数で渡した変数にそれぞれ追加されていきます。通常ではそれぞれマッチする順番に応じて数字のキーが割り当てられますが、数字ではなく文字列のキーを指定することもできたりします。 <?php $subject = '<a href="http://www.symfo
能書き 前エントリを書いてからいろいろと調べていて驚いたんだけど、日本語のwebsiteで、それなりにまともにRFC822(RFC2822,RFC5322)に準拠した(もしくはきちんと意図的に準拠していない部分を選択している)正規表現はPerlだろうがPHPだろうがRubyだろうが軽くぐぐった程度では見当たらない。PerlのモジュールのEmail::AddressもEmail::Validも程度の差はあれ問題を抱えている。そこらへんの既存の出回ってる正規表現にどういった問題があるかなんてことは次回エントリにて。 というわけで、Perl、PHP、RubyでRFC5322準拠なメールアドレス(addr-spec)の正規表現を以下に示します。尚、addr-specの最終的な正規表現のみならずそれを作成するに至る部分も併記してあります。これは、最終的な正規表現だけでは難解すぎてとても理解できないか
社内勉強会として、正規表現について喋ってみました。「最長一致」をテーマに、正規表現マッチのイメージが湧いていない人にもわかるような内容を目指したつもりですが、POSIXとPCREの最長一致の違いなど、ややマニアックな内容も含んでいます。 第29回PHP勉強会でも似た内容で発表させてもらいましたが、実はこの社内勉強会のプレゼンの一部を取り出して紹介したものでした。 今回のムービーはzoomeにアップロードしてみました。アップロードされている他のムービーと見比べると異色な内容のような気がしますが、ありがたく使わせて頂きます。 ムービー 発表資料 スライド(PDF) 補足1: 「最短一致は使わない」について 基本的に最短一致は使うな、という結論にしてしまっているのですが、これは説明を端折っている面が大きいです。私の考えでは、正規表現初心者の頃は特にそうなのですが、「マッチングが最長一致であるため
どうやら昨日の記事が早速トラックバックされているようですので、NP_HatenaLike(本体のみ)、ブリーフケースにあげておきます。完成形ソフトあたり。 使用方法は、ただプラグインとして登録するのみです。mediaタグなどが展開されていてもいなくても影響はありませんので、順序はどうでもかまいません。NP_HighlightSourceなどは、調べていませんが、NP_HatenaLikeより先に実行すれば何とかなるかな? なお、注釈機能はサポートしてないので、NP_FootNoteあたりを使用してください。 続きに概要を書きます。この辺の内容は実際にダウンロードページに書くのと同じ物(予定) サポートしている記法や機能 はてなになくて、こっちでサポートしているものには(独自)と書いてあります。 各行をpタグで囲む クラスを指定したpタグ(独自) <で始まる行は引用行とする(quoteクラス
「実用的なPHP用の正規表現x8」というphpspot開発日誌という記事で、 8 Practical PHP Regular Expressions – Web devlopment blogという、今日del.icio.us/popularに出ていた記事の紹介がされている。このサイトの記事はいつもそうだけど、はてなブックマークでも人気で、既に50名を越えるユーザにブックマークされているようだ。 1 メールアドレスチェック $string = "first.last@domain.co.uk"; if (preg_match( '/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/', $string)) { echo "example 3 successf
はてブでotsuneさんやkazuhookuさんがPHPクオリティについて勘違いしていたので、一言申し上げたところ、参考にされた方がいたようで、もうちょっと補足します。 いくつか実装での「正しいメールアドレス」を調べてみました。 phpspot function is_mail($text) { if (preg_match('/^[a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+$/',$text)) { return TRUE; } else { return FALSE; } } PEAR::Mail_RFC822 function isValidInetAddress($data, $strict = false) { $regex = $strict ? '/^([.0-9a-z_+-]+)@(([0-9a-z-]+¥.)+[0-9a-z]{2,})$/i'
Otsuneのtwitter経由でphpspotがオススメするメールアドレスの正規表現。8:2ルールを採用したような簡便な正規表現にはてブのコメント欄が賑わっている。 「メールアドレス 正規表現」で検索すると最初に出てくるリソースに、思いっきり メールアドレスに一致する正規表現は「ありません」 なんてあって、その下に条件付きの鬼のような正規表現が紹介されている。メールアドレスの闇は深い。ヘタに触れると火傷する。 一応正確なアドレスを弾かずに、「なるべく」おかしなアドレスを弾く正規表現として $d3 = '\\d{1,3}'; $ip = join('\\.', ($d3) x 4); $ascii = '[\\x01-\\x7F]'; $domain = '([-a-z0-9]+\\.)*[a-z]+'; $mailre = "^$ascii+\\@($domain|\\\\[$ip\\\
PHPでファイルをアップロードしたとき $_FILES にアップロードされたファイルについての情報が入っています。 そして $_FILES[...]['type'] にはアップロードされたファイルの MIME type が入っています。しかしここに入っている値は PHP: ファイルアップロードの処理 - Manual に $_FILES['userfile']['type'] ファイルの MIME 型。ただし、ブラウザがこの情報を提供する場合。 例えば、"image/gif" のようになります。 この MIME 型は PHP 側ではチェックされません。そのため、 この値は信用できません。 と書かれている通り信頼できません。ソースコードを見てみると php-5.1.4/main/rfc1867.c の SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post
平素より「PHPプロ!」をご愛顧いただき、誠にありがとうございます。 2006年より運営してまいりました「PHPプロ!」ですが、サービスの利用状況を鑑みまして、2018年9月25日(火曜日)をもちましてサービスを終了させていただくことになりました。 サービス終了に伴いまして、2018年8月28日(火曜日)を持ちまして、新規会員登録ならびにQ&A掲示板への新たな質問、回答の投稿を停止させていただきます。 なお、ご登録いただいた皆様の個人情報につきましては、サービス終了後、弊社が責任をもって消去いたします。 これまで多くの皆様にご利用をいただきまして、誠にありがとうございました。 サービス終了に伴い、皆様にはご不便をおかけいたしますこと、心よりお詫び申し上げます。 本件に関するお問い合わせはこちらよりお願いいたします。
評伝シャア・アズナブル 《赤い彗星》の軌跡 下巻 (KCピ-ス) 作者: 皆川ゆか出版社/メーカー: 講談社発売日: 2006/12/07メディア: 新書購入: 5人 クリック: 43回この商品を含むブログ (92件) を見る 読破!本当に他人事とは思えないぜ。。。 っていうか、Amazonランキングで20位台って初めて見た。(w まずは、この辺(1・2・3・4・5)を参照してもらった上で、どうしてこうなっているのか説明をしたいと思います。 書こうと思ったキッカケはオレンジニュースで掲載されていたので。 参照して頂ければ(参照しなくても)分かると思いますが、PHP4系統ではマルチバイト対応正規表現関数(mb_ereg系)はUTF-8の文字列を正しく処理できませんが、PHP5系統では正しく処理できます。 理由は簡単で、PHP4系統とPHP5系統ではマルチバイト対応正規表現ライブラリの実装が全
ウノウラボ Unoh Labs: PHPのちょっとしたコツ 最近のスクリプト言語は機能が多く、基本的な機能はほとんど実装されているので、アルゴリズムをどうこうするより、どの機能を使うか選ぶ方が重要だったりしますね(コーディングの効率的にも)。 自分にもそういったレベルで気をつけていることがいくつかあります。 -[早起き生活]PHPのパフォーマンスチューニング -[早起き生活]PHPのパフォーマンスチューニング その2:count()も使い過ぎると重くなる -[早起き生活]PHPのパフォーマンスチューニング その3:APC投入 あと、最近気づいたTIPSとしては、 日本語を正規表現検索したいときでもereg系の関数を使うのはやめとけ なんてのもあります。 PHPの組み込み正規表現関数にはPHP独自のereg系とPerl互換のpreg系がありますが、ヘルプに書いてあるとおり、ereg系
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く