2012-06-24 5 views
27

私は私がやろうとしていますどのような以下のHTML文のpreg_replace_callbackの使い方は?

[otsection]Wallpapers[/otsection] 
WALLPAPERS GO HERE 

[otsection]Videos[/otsection] 
VIDEOS GO HERE 

を持っては、HTMLのdivで[otsection]タグを置き換えるです。例えば、上記のステートメントは、私の知る限りとして

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

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

に変換する必要がありますキャッチ私は> 31-> 2-、などからのdivのIDをインクリメントしたいます。..

ので、これを行う最良の方法はpreg_replace_callbackを使用して各置換の間でid変数を増やすことです。しかし、この作業の1時間後、私はそれを働かせることはできません。

これについてのご支援をいただければ幸いです。次

答えて

38

用途:特に

$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); 
+0

どのように '$ in'に件名を入力できますか? –

+0

@SheikhHeeraそれはすでにそこにあるはずです。私は通常、データの入出力先を示すために '$ in'と' $ out'を使います。とにかく、ニースの答えは –

+0

です。 –

22

:以下は一般的な答えであることを意図していると、それはすでにaddressed beforeあったようOPの特定の問題を解決しようとしません。 。

preg_replace_callback()は何ですか?

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

いつ使用しますか?

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

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

使用方法は?

は、ここでの関数の使用法を説明する例です。ここでは、日付文字列をYYYY-MM-DD形式からDD-MM-YYYYに変換しようとしています。N0至るまでの数字かもしれない形式NNNN-NN-NNの日付文字列のための

// 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; 
ここ

、当社の正規表現パターンを検索 - 9\dは、文字クラス[0-9]の略記表現です)。コールバック関数が呼び出され、指定された文字列に一致する要素の配列が渡されます。

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

22-02-2014 

注:上記の例は例示のみの目的のためのものです。 は、で日付を解析するべきではありません。代わりにDateTime::createFromFormat()DateTime::format()を使用してください。詳細はThis questionです。