サーチ…


構文

  • 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_ORDERPREG_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> 


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow