PHP
正規表現(regexp / PCRE)
サーチ…
構文
-
preg_replace($pattern, $replacement, $subject, $limit = -1, $count = 0);
-
preg_replace_callback($pattern, $callback, $subject, $limit = -1, $count = 0);
-
preg_match($pattern, $subject, &$matches, $flags = 0, $offset = 0);
-
preg_match_all($pattern, $subject, &$matches, $flags = PREG_PATTERN_ORDER, $offset = 0);
-
preg_split($pattern, $subject, $limit = -1, $flags = 0)
パラメーター
パラメータ | 詳細 |
---|---|
$pattern | 正規表現の文字列(PCREパターン) |
備考
PHP正規表現は、Perl正規表現から派生したPCREパターン標準に従います。
PHPのすべてのPCRE文字列は区切り文字で囲む必要があります。区切り文字には、英数字以外の非バックスラッシュ、空白以外の文字を使用できます。一般的なデリミタは~
、 /
、 %
です。
PCREパターンには、グループ、文字クラス、文字グループ、ルックアヘッド/ルックアヘッドアサーション、およびエスケープ文字を含めることができます。
$pattern
文字列にPCRE修飾子を使用することは可能です。一般的なものには、 i
(大文字小文字を区別しない)、 m
(複数行)、 s
(改行を含むドットメタキャラクタ)があります。 g
(グローバル)修飾子は使用できません。代わりにpreg_match_all
関数を使用します。
PCRE文字列へのマッチは$
プレフィックス付きの番号付き文字列で行います:
<?php
$replaced = preg_replace('%hello ([a-z]+) world%', 'goodbye $1 world', 'hello awesome world');
echo $replaced; // 'goodbye awesome world'
正規表現との文字列一致
preg_match
は、文字列が正規表現に一致するかどうかをチェックします。
$string = 'This is a string which contains numbers: 12345';
$isMatched = preg_match('%^[a-zA-Z]+: [0-9]+$%', $string);
var_dump($isMatched); // bool(true)
3番目のパラメータを渡すと、正規表現の一致するデータが入力されます。
preg_match('%^([a-zA-Z]+): ([0-9]+)$%', 'This is a string which contains numbers: 12345', $matches);
// $matches now contains results of the regular expression matches in an array.
echo json_encode($matches); // ["numbers: 12345", "numbers", "12345"]
$matches
は、カッコで区切られた正規表現内の部分マッチング全体の配列と、カッコを開いた順に並べられた部分文字列が含まれます。つまり、正規表現として/z(a(b))/
がある場合、インデックス0には部分文字列zab
が含まれ、インデックス1には外側の括弧ab
囲まれた部分文字列が含まれ、インデックス2には内側の括弧b
が含まれます。
文字列を正規表現で配列に分割する
$string = "0| PHP 1| CSS 2| HTML 3| AJAX 4| JSON";
//[0-9]: Any single character in the range 0 to 9
// + : One or more of 0 to 9
$array = preg_split("/[0-9]+\|/", $string, -1, PREG_SPLIT_NO_EMPTY);
//Or
// [] : Character class
// \d : Any digit
// + : One or more of Any digit
$array = preg_split("/[\d]+\|/", $string, -1, PREG_SPLIT_NO_EMPTY);
出力:
Array
(
[0] => PHP
[1] => CSS
[2] => HTML
[3] => AJAX
[4] => JSON
)
文字列を配列に分割するには、文字列とpreg_split();
正規表現をpreg_split();
一致して検索するには、3番目のパラメータ( limit
)を追加すると、 "一致"の数を設定して、残りの文字列を配列の末尾に追加します。
4番目のパラメータは( flags
)です。ここでは、 PREG_SPLIT_NO_EMPTY
を使用して配列に空のキー/値が含まれないようにします。
正規表現に置き換えられた文字列
$string = "a;b;c\nd;e;f";
// $1, $2 and $3 represent the first, second and third capturing groups
echo preg_replace("(^([^;]+);([^;]+);([^;]+)$)m", "$3;$2;$1", $string);
出力
c;b;a
f;e;d
セミコロン間のすべてを検索し、順序を逆にします。
グローバル正規表現マッチ
preg_match_all
を使用して、 グローバル RegExp一致を実行できます。 preg_match_all
は、件名文字列内のすべての一致する結果を返します( preg_match
とは異なり、最初の文字列のみを返します)。
preg_match_all
関数は一致する数を返します。 3番目のパラメータ$matches
は、4番目のパラメータで指定できるフラグで制御された形式の$matches
を含みます。
配列を指定した場合は、 $matches
あなたが取得したい似た形式の配列が含まれていますpreg_match
ことを除いて、 preg_match
最初の試合で停止し、 preg_match_all
文字列が完全に消費され、多次元配列の各反復の結果を返しますされるまでの文字列を反復処理このフォーマットは第4引数のフラグによって制御することができます。
4番目の引数$flags
、 $matches
配列の構造を制御します。デフォルトのモードはPREG_PATTERN_ORDER
、可能なフラグはPREG_SET_ORDER
とPREG_PATTERN_ORDER
です。
次のコードは、 preg_match_all
使用方法を示しています。
$subject = "a1b c2d3e f4g";
$pattern = '/[a-z]([0-9])[a-z]/';
var_dump(preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER)); // int(3)
var_dump($matches);
preg_match_all($pattern, $subject, $matches); // the flag is PREG_PATTERN_ORDER by default
var_dump($matches);
// And for reference, same regexp run through preg_match()
preg_match($pattern, $subject, $matches);
var_dump($matches);
PREG_SET_ORDER
の最初のvar_dumpはこの出力を示します:
array(3) {
[0]=>
array(2) {
[0]=>
string(3) "a1b"
[1]=>
string(1) "1"
}
[1]=>
array(2) {
[0]=>
string(3) "c2d"
[1]=>
string(1) "2"
}
[2]=>
array(2) {
[0]=>
string(3) "f4g"
[1]=>
string(1) "4"
}
}
$matches
は3つのネストされた配列があります。各配列は1つの一致を表し、 preg_match
戻り値と同じ形式です。
2番目のvar_dump( PREG_PATTERN_ORDER
)は次の出力を出力します。
array(2) {
[0]=>
array(3) {
[0]=>
string(3) "a1b"
[1]=>
string(3) "c2d"
[2]=>
string(3) "f4g"
}
[1]=>
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "4"
}
}
同じregexpがpreg_match
を通して実行されると、以下の配列が返されます:
array(2) {
[0] =>
string(3) "a1b"
[1] =>
string(1) "1"
}
コールバックで文字列を置換
preg_replace_callback
は、一致するすべてのキャプチャグループを定義されたコールバックに送信し、コールバックの戻り値で置き換えます。これにより、あらゆる種類のロジックに基づいて文字列を置き換えることができます。
$subject = "He said 123abc, I said 456efg, then she said 789hij";
$regex = "/\b(\d+)\w+/";
// This function replaces the matched entries conditionally
// depending upon the first character of the capturing group
function regex_replace($matches){
switch($matches[1][0]){
case '7':
$replacement = "<b>{$matches[0]}</b>";
break;
default:
$replacement = "<i>{$matches[0]}</i>";
}
return $replacement;
}
$replaced_str = preg_replace_callback($regex, "regex_replace", $subject);
print_r($replaced_str);
# He said <i>123abc</i>, I said <i>456efg</i>, then she said <b>789hij</b>