web-dev-qa-db-ja.com

preg_replace_callbackの使用方法

私は次のHTMLステートメントを持っています

[otsection]Wallpapers[/otsection]
WALLPAPERS GO HERE

[otsection]Videos[/otsection]
VIDEOS GO HERE

私がやろうとしているのは、[otsection]タグをhtml divに置き換えることです。キャッチは、divのidを1-> 2-> 3などからインクリメントすることです。

したがって、たとえば、上記のステートメントは

<div class="otsection" id="1">Wallpapers</div>
WALLPAPERS GO HERE

<div class="otsection" id="2">Videos</div>
VIDEOS GO HERE

私が調べられる限り、これを行う最善の方法は、preg_replace_callbackを使用して、各置換の間にid変数をインクリメントすることです。しかし、これに1時間取り組んだ後、私はそれを機能させることができません。

これに関する支援は大歓迎です!

33
Mark

以下を使用してください。

$out = preg_replace_callback(
    "(\[otsection\](.*?)\[/otsection\])is",
    function($m) {
        static $id = 0;
        $id++;
        return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>";
    },
    $in);

特に、static変数を使用したことに注意してください。この変数は、関数の呼び出し間で持続します。つまり、関数が呼び出されるたびに増分され、一致するたびに変数が増加します。

また、IDにotsを追加したことに注意してください。要素IDは数字で始まってはいけません。


PHP 5.3以前の場合:

$out = preg_replace_callback(
    "(\[otsection\](.*?)\[/otsection\])is",
    create_function('$m','
        static $id = 0;
        $id++;
        return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>";
    '),
    $in);
46

:以下は一般的な回答であることを意図しており、すでに特定されているOPの特定の問題を解決しようとしません 以前に対処しました

preg_replace_callback()とは?

この関数は、正規表現の検索と置換を実行するために使用されます。 str_replace() に似ていますが、プレーンな文字列ではなく、ユーザー定義の正規表現パターンを検索し、一致したアイテムにコールバック関数を適用します。この関数は、一致するものが見つかった場合は変更された文字列を返し、そうでない場合は未変更の文字列を返します。

いつ使うべきですか?

preg_replace_callback()preg_replace() と非常に似ています-唯一の違いは、2番目のパラメーターに置換文字列を指定する代わりに、callback関数を指定することです。

単純な正規表現の検索と置換を行う場合は、preg_replace()を使用します。単に交換する以上のことを行う場合は、preg_replace_callback()を使用します。仕組みを理解するには、以下の例を参照してください。

使用方法

以下は、関数の使用法を説明する例です。ここでは、日付文字列をYYYY-MM-DD形式からDD-MM-YYYYに変換しようとしています。

// our date string
$string  = '2014-02-22';

// search pattern
$pattern = '~(\d{4})-(\d{2})-(\d{2})~';

// the function call
$result = preg_replace_callback($pattern, 'callback', $string);

// the callback function
function callback ($matches) {
    print_r($matches);
    return $matches[3].'-'.$matches[2].'-'.$matches[1];
}

echo $result;

ここで、正規表現パターンはNNNN-NN-NN形式の日付文字列を検索します。ここで、N0-9\dは文字クラスの短縮表現([0-9])。コールバック関数が呼び出され、指定された文字列の一致した要素の配列が渡されます。

最終結果は次のとおりです。

22-02-2014

注:上記の例は、説明のみを目的としています。あなたは日付の解析に使用すべきではありません。代わりに DateTime::createFromFormat() および DateTime::format() を使用してください。 この質問 に詳細があります。

26
Amal Murali