裏メニュー第五週 †正規表現 †PHPで正規表現を使用する方法について説明します。 ファイル取得関数 †PHPにはファイルを操作するための関数が多数存在します。 file_get_contentsは第一引数としてファイル名を受取り、ファイルの中身を返り値とする関数です。 <?php $string = file_get_contents('/home/y-mahata/htdocs/pukiwiki/README.txt'); echo $string; ?> 実行結果は次のようになります。 名前
PukiWiki - 自由にページを追加・削除・編集できるWebページ構築スクリプト
Version 1.4.7
Copyright (C)
2001-2006 PukiWiki Developers Team
2001-2002 yu-ji (Based on PukiWiki 1.3 by yu-ji)
License: GPL version 2 or (at your option) any later version
(略)
このプログラムは、s-tanno.comのファイル(/home/y-mahata/htdocs/pukiwiki/README.txt)を読込み、 また、file_get_contentsは第一引数にURLを渡すこともできます。 <?php $string = file_get_contents('http://y-mahata.s-tanno.com/pukiwiki/'); echo $string; ?> 実行結果は次のようになります。 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" /> <meta http-equiv="content-style-type" content="text/css" /> <title>FrontPage - PukiWiki</title> (略) このプログラムは、 http://y-mahata.s-tanno.com/pukiwiki/ を読込み、 文字コード変換関数 †PHPにはマルチバイト文字列を操作するための関数が多数存在します。 mb_convert_encodingは第一引数として文字列を、第二引数として変換先文字コードを、第三引数として変換元文字コードを受取り、
文字コードを変換した後の文字列を返り値とする関数です。 第二引数や第三引数として指定できる値(文字コード)には次のようなものがあります。
最後の'auto'は文字コードの判別を「自動で行いたい」ときに第三引数に指定します。 簡単なサンプルを示します。 <html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS" />
</head>
<body>
<?php
echo mb_convert_encoding('UTF-8からShift-JISに変換された文字列です。', 'SJIS', 'UTF-8');
?>
</body>
</html>
metaタグ内でShift-JISのページであると指定しているにも関わらず、文字化けが発生しないことを確認してください。 PCRE関数 †PHPには正規表現を利用するための関数が多数存在します。 PCRE関数を学ぶ前に、正規表現を次のように定義しましょう。 コンピューターで文字列の検索や置換を行う時に用いられる表記法。 通常の文字のほかに、メタキャラクターという特殊の意味を持つ記号を組み合わせることにより、 特定の文字列のパターンを検索・抽出・置換することができる。 (正規表現 とは - コトバンク) この定義からわかるように、正規表現を利用するためには 例としてURL中からドメイン部分を抽出するプログラムを示します。
現時点でこのプログラムの詳細が掴めなくても問題ありません。
preg_match関数の第一引数に'@^http://([^/]+)@i'という不思議な文字列が渡っていることだけ確認してください。
この'@^http://([^/]+)@i'が「パターン」と呼ばれるものであり、 メタ文字 †メタ文字の中でもよく使われるものについて取り上げます。 メタ文字には二種類あり、一つは「角カッコ内を除き、パターン中のどこででも使用できる文字」で、もう一つは「角カッコで括られた中でだけ使用できる文字」です。 「角カッコ内を除き、パターン中のどこででも使用できる文字」には次のようなものがあります。
「角カッコで括られた中でだけ使用できる文字」には次のようなものがあります。
特に注意すべきなのは ^ の意味が出現位置によって異なる点です。 パターン修飾子 †パターン修飾子の中でもよく使われるものについて取り上げます。
正規表現が「貪欲である」とは「できるだけ長いの文字列にマッチする」という意味です。 メタ文字とパターン修飾子を組合せたサンプル †次のプログラムを実行し、正規表現の動作を確かめてみましょう。 <?php function NumCheck($text) { if (1 === preg_match('/^[0-9]+$/', $text)) { echo "'{$text}'は数字列です。\n"; } else { echo "'{$text}'は数字列ではありません。\n"; } } function StringCheck($text) { // if (1 === preg_match('/^[a-z]+$/i', $text)) { // これでも可 if (1 === preg_match('/^[a-zA-Z ]+$/', $text)) { echo "'{$text}' は英文字列です。\n"; } else { echo "'{$text}' は英文字列ではありません。\n"; } } function TemperatureCheck($text) { if (1 === preg_match('/^([+-]?[0-9]+)([CF])$/', $text, $matches)) { if ('C' === $matches[2]) { echo "'{$text}' はセ氏{$matches[1]}度です。\n"; } else { echo "'{$text}' は華氏{$matches[1]}度です。\n"; } } else { echo "'{$text}' は温度ではありません。\n"; } } // 厳密な電子メールアドレスのチェックにはなっていません // ref) http://blog.livedoor.jp/dankogai/archives/51189905.html // ref) "(?:" について http://jp.php.net/manual/ja/regexp.reference.subpatterns.php function MailCheck($text) { if (1 === preg_match('/^[a-zA-Z0-9_-]+\@[a-zA-Z0-9_-]+(?:\.\w+)+$/', $text, $matches)) { echo "'{$text}' は(たぶん)電子メールアドレスです(...なんじゃないかなあ)。\n"; } else { echo "'{$text}' は(たぶん)電子メールアドレスではありません(...だと思うなあ)。\n"; } } // 厳密なURLのチェックにはなっていません function UrlCheck($text) { if (1 === preg_match('@^(?:http://)([^/]+)@i', $text, $matches)) { echo "'{$text}' は(たぶん)URLです(...なんじゃないかなあ)。ドメインは'{$matches[1]}'だと思います。\n"; } else { echo "'{$text}' は(たぶん)URLではありません(...だと思うなあ)。\n"; } } $strings = array('0123456789', // 単純な数字列 'this is a sentence', // 単純な英文字列 'i have 30 dollars in my wallet', // 数字と文字の組合せ '-35C', // 南極の気温 'foobar@example.co.jp', // 電子メールアドレス 'http://www.example.com/foo/bar.html' // URL ); foreach ($strings as $string) { NumCheck($string); StringCheck($string); TemperatureCheck($string); MailCheck($string); UrlCheck($string); echo "\n"; } ?> また、貪欲な正規表現の振舞いを理解するために、次のプログラムを実行し、結果を考察しましょう。 <?php $text = 'The author of "Wicked" also wrote "Mirror, Mirror."'; if (preg_match('/".+"/', $text, $matches)) { echo "$matches[0]\n"; } if (preg_match('/".+"/U', $text, $matches)) { echo "$matches[0]\n"; } ?> 宿題 †正規表現に習熟するためには、多くの正規表現の読み書きをこなすしかありません。
参考資料 † |