2012-10-29 19 views
6

私はクライアントにWYSIWYGエディタに短いコードを挿入して、さまざまなコードスニペットを持つ関数を呼び出すことができます。php文字列の代わりに正規表現を置き換えます。

例えば、彼らは何かのように書きます...

[getSnippet(1)] 

これは、適切な 'チャンク' 私getSnippet($ ID)PHP関数と出力を呼び出します。私のハードコードは、このような$ IDを...

echo str_replace('[getSnippet(1)]',getSnippet(1),$rowPage['sidebar_details']); 

は、しかし、私は本当に「1」を動的にしたいとき

は、それは動作します。私は一種のようなもので正しい軌道に乗って...

function getSnippet($id) { 
if ($id == 1) { 
    echo "car"; 
} 
} 

$string = "This [getSnippet(1)] is a sentence.This is the next one."; 
$regex = '#([getSnippet(\w)])#'; 
$string = preg_replace($regex, '. \1', $string); 

//If you want to capture more than just periods, you can do: 
echo preg_replace('#(\.|,|\?|!)(\w)#', '\1 \2', $string); 

はかなり

+0

コードではどうなりますか? – hakre

+0

'preg_replace_callback()'を見てください。これは、正規表現にマッチした文字列のビットを受け取る関数を提供し、置換を返します。 – Barmar

答えて

0

は、まずあなたの正規表現にリテラルの括弧を追加する必要があります:(働いてないんだけど(あなたが持っているものだけで\wをキャプチャするが、それは、括弧そのもの)と一致しません。

$regex = '#(\[getSnippet\((\w)\)\])#'; 

は、私はまた、角括弧をエスケープし、そうでない場合は、文字クラスをオープンします。また、これはパラメータのための唯一の1文字をキャプチャすることに注意してください

。!

しかし、私はあなたがこのような正規表現で、preg_replace_callbackを使用することをお勧め:私はreturnにごgetSnippetechoを変更

function getSnippet($id) { 
    if ($id == 1) { 
     return "car"; 
    } 
} 

function replaceCallback($matches) { 
    return getSnippet($matches[1]); 
} 

$string = preg_replace_callback(
    '#\[getSnippet\((\w+)\)\]#', 
    'replaceCallback', 
    $string 
); 

注意。

コールバック内$matches[1]には最初に取得されたグループが含まれます(この場合は複数の文字が許可されます)。もちろんgetSnippet機能を調整してをリダイレクトせずに$matchesアレイからidを読み取ることもできます。

しかし、このアプローチは、複数の機能にリダイレクトすることができるので、少し柔軟になります。例として、正規表現を#\[(getSnippet|otherFunction)\((\w+)\)\]#に変更した場合、2つの異なる関数を見つけることができ、replaceCallbackは関数の名前を$matches[1]に見つけることができ、パラメータ$matches[2]で関数を呼び出します。このように:

function getSnippet($id) { 
    ... 
} 

function otherFunction($parameter) { 
    ... 
} 

function replaceCallback($matches) { 
    return $matches[1]($matches[2]); 
} 

$string = preg_replace_callback(
    '#\[(getSnippet|otherFunction)\((\w+)\)\]#', 
    'replaceCallback', 
    $string 
); 

これは実際にどこに行きたいかによって決まります。重要なことは、preg_replace_callbackを使用せずに、置換の任意のパラメータを処理する方法がないことです。

+0

ありがとうございました。これは現時点では本当に近いようです。このような文字列を使用すると、... '$ string =" [getSnippet(1)]これはiと同じです関数から返されたテキストを取得するが、他のテキストを失う... 'ie:Car。ボート。' しかし、それは... 'でなければなりません "カー。このijioj oiajs dfoij dsofij aoisfj oiasdfj。ボート。fとASDをadfas。" ' おかげで再び。 –

+0

あなたの答えは、私の文章の残りの部分が削除されていることを除いて、私が欲しいと思うようにほとんど動作しています。関数呼び出しによって返されたテキストのみが残ります。再度、感謝します。 –

+0

'getSnippet'の' echo'を 'return'に変更してください。私はそれを変更したと思ったが、明らかにコピーペーストミスをしたようだ。 –

関連する問題