42

次の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時間取り組んだ後、私はそれを機能させることができません。

これに関するご支援をいただければ幸いです。

4

2 に答える 2

54

以下を使用します。

$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変数を使用したことに注意してください。この変数は、関数の呼び出し間で保持されます。つまり、関数が呼び出されるたびに増分されます。これは、一致ごとに発生します。

otsまた、 ID の先頭に追加したことに注意してください。要素 ID を数字で始めないでください。


5.3 より前の PHP の場合:

$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);
于 2012-06-24T03:49:35.323 に答える
37

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

とはpreg_replace_callback()?

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

いつ使用すればよいですか?

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

単純な正規表現の検索と置換を行う場合に使用preg_replace()します。preg_replace_callback()交換以外のことをしたい場合に使用します。それがどのように機能するかを理解するには、以下の例を参照してください。

それの使い方?

関数の使用法を示す例を次に示します。ここでは、日付文字列をYYYY-MM-DDformat からに変換しようとしています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ある形式の日付文字列を検索します(は文字クラスの簡略表現です)。コールバック関数が呼び出され、指定された文字列内の一致する要素の配列が渡されます。N09\d[0-9]

最終結果は次のようになります。

22-02-2014

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

于 2014-02-07T15:02:45.037 に答える