前回の記事では、php 正規表現の使用方法とその開始方法を学びました。今日は、php 正規表現の 共通関数 を紹介することに焦点を当てます。この 2 つの組み合わせは完璧に使用できます。 !
1. preg_match()
関数のプロトタイプ:
int preg_match (string $pattern, string $content [, array $matches])
preg_match () 関数は、$pattern で指定された正規表現に一致するコンテンツを $content 文字列から検索します。 $matches が指定されている場合、一致する結果がそこに配置されます。 $matches[0] にはパターン全体に一致するテキストが含まれ、$matches[1] には括弧で囲まれたパターン要素の最初にキャプチャされた一致が含まれます。この関数は 1 つの一致のみを実行し、最終的には 0 または 1 の一致結果の数を返します。リスト 6.1 は、preg_match() 関数のコード例を示しています。
コード 6.1 日付と時刻のマッチング
コードは次のとおりです:
<?php //需要匹配的字符串。date函数返回当前时间 $content = "Current date and time is ".date("Y-m-d h:i a").", we are learning PHP together."; //使用通常的方法匹配时间 if (preg_match ("//d{4}-/d{2}-/d{2} /d{2}:/d{2} [ap]m/", $content, $m)) { echo "匹配的时间是:" .$m[0]. "/n"; } //由于时间的模式明显,也可以简单的匹配 if (preg_match ("/([/d-]{10}) ([/d:]{5} [ap]m)/", $content, $m)) { echo "当前日期是:" .$m[1]. "/n"; echo "当前时间是:" .$m[2]. "/n"; } ?>
これは、単純な動的テキスト文字列マッチングの例です。現在のシステム時刻を「2006年8月17日13時25分」とすると、以下の内容が出力されます。
一致する時刻は: 2006-08-17 01:25 pm
現在の日付は: 2006-08-17
現在の時刻は: 01:25 pm
2. ereg() と eregi()
ereg() は、POSIX 拡張ライブラリの正規表現のマッチング関数です。 eregi() は、ereg() 関数の大文字と小文字を無視するバージョンです。どちらも preg_match と同様の関数を持っていますが、この関数は一致が成功したかどうかを示すブール値を返します。 POSIX 拡張ライブラリ関数の最初のパラメータは正規表現文字列を受け入れる、つまり区切り文字は必要ないことに注意してください。たとえば、リスト 6.2 はファイル名のセキュリティをチェックする方法です。
コード 6.2 ファイル名のセキュリティチェック
コードは次のとおりです:
<?php $username = $_SERVER['REMOTE_USER']; $filename = $_GET['file']; //对文件名进行过滤,以保证系统安全 if (!ereg('^[^./][^/]*$', $userfile)) { die('这不是一个非法的文件名!'); } //对用户名进行过滤 if (!ereg('^[^./][^/]*$', $username)) { die('这不是一个无效的用户名'); } //通过安全过滤,拼合文件路径 $thefile = "/home/$username/$filename"; ?>
通常、Perl 互換の正規表現マッチング関数 perg_match() を使用する方が、 ereg() や eregi() を使用するよりも優れています。 ) もっと早く。文字列に特定の部分文字列が含まれているかどうかだけを確認したい場合は、strstr() 関数または strpos() 関数を使用することをお勧めします。
正規表現の置換
1. ereg_replace() と eregi_replace()
関数プロトタイプ:
string ereg_replace (string $pattern, string $replacement, string $string) string eregi_replace (string $pattern, string $replacement, string $string)
ereg_replace() は、$string 内のパターン文字列 $pattern を検索し、一致した結果を $replacement に置き換えます。 $pattern にパターン ユニット (またはサブパターン) が含まれている場合、「/1」や「$1」などの $replacement 内の位置は、これらのサブパターンに一致するコンテンツに置き換えられます。また、「/0」または「$0」は、一致する文字列全体の内容を指します。バックスラッシュは二重引用符内のエスケープ文字として使用されるため、「//0」および「//1」の形式を使用する必要があることに注意してください。
eregi_replace() と ereg_replace() は、前者が大文字と小文字を区別しないことを除いて、同じ機能を持ちます。コード 6.6 は、この関数の応用例です。このコードは、プログラムのソース コードに対して簡単なクリーニング作業を行う方法を示しています。
コード 6.6 ソース コードのクリーンアップ
コードは次のとおりです:
<?php $lines = file('source.php'); //将文件读入数组中 for($i=0; $i<count($lines); $i++) { //将行末以“//”或“#”开头的注释去掉 $lines[$i] = eregi_replace("(////|#).*$", "", $lines[$i]); //将行末的空白消除 $lines[$i] = eregi_replace("[ /n/r/t/v/f]*$", "/r/n", $lines[$i]); } //整理后输出到页面 echo htmlspecialchars(join("",$lines)); ?>
2. preg_replace()
関数プロトタイプ:
mixed preg_replace (mixed $pattern, mixed $replacement, mixed $subject [, int $limit])
preg_replace は ereg_replace よりも強力です。最初の 3 つのパラメータはすべて配列を使用でき、4 番目のパラメータ $limit は置換数を設定でき、デフォルトではすべて置換されます。コード6.7は配列置換の応用例です。
コード6.7 配列置換
コードは以下の通りです:
<?php //字符串 $string = "Name: {Name}<br>/nEmail: {Email}<br>/nAddress: {Address}<br>/n"; //模式 $patterns =array( "/{Address}/", "/{Name}/", "/{Email}/" ); //替换字串 $replacements = array ( "No.5, Wilson St., New York, U.S.A", "Thomas Ching", "tom@emailaddress.com", ); //输出模式替换结果 print preg_replace($patterns, $replacements, $string); ?>
出力結果は以下の通りです。
Name: Thomas Ching", Email: tom@emailaddress.com Address: No.5, Wilson St., New York, U.S.A
preg_replaceの正規表現ではパターン修飾子「e」が使用できます。その機能は、一致結果を式として使用することであり、再操作できます。例:
コードは次のとおりです:
<?php $html_body = “<HTML><Body><H1>TEST</H1>My Picture<Img src=”my.gif”></Body></HTML>”; //输出结果中HTML标签将全部为小写字母 echo preg_replace ( "/(<//?)(/w+)([^>]*>)/e", "'//1'.strtolower('//2').'//3'", //此处的模式变量//2将被strtolower转换为小写字符 $html_body); ?>
概要:
preg_replace 関数は Perl 互換の正規表現構文を使用し、通常は ereg_replace のより高速な代替です。文字列の単純な置換のみを実行したい場合は、str_replace 関数を使用できます。
関連する推奨事項:
以上がPHP正規表現でよく使われる関数を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。