私は次の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時間取り組んだ後、私はそれを機能させることができません。
これに関する支援は大歓迎です!
以下を使用してください。
$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);
注:以下は一般的な回答であることを意図しており、すでに特定されているOPの特定の問題を解決しようとしません 以前に対処しました 。
この関数は、正規表現の検索と置換を実行するために使用されます。 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
形式の日付文字列を検索します。ここで、N
は0
-9
(\d
は文字クラスの短縮表現([0-9]
)。コールバック関数が呼び出され、指定された文字列の一致した要素の配列が渡されます。
最終結果は次のとおりです。
22-02-2014
注:上記の例は、説明のみを目的としています。あなたは日付の解析に使用すべきではありません。代わりに DateTime::createFromFormat()
および DateTime::format()
を使用してください。 この質問 に詳細があります。