6

WYSIWYG エディターに短いコードを挿入することで、クライアントがさまざまなコード スニペットを持つ関数を呼び出せるようにしようとしています。

たとえば、彼らは次のように書きます...

[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);

うまくいきません:(

4

1 に答える 1

0

まず、正規表現で、リテラルの括弧を追加する必要があります (キャプチャしたばかり\wで、括弧自体と一致しないもの):

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

角かっこもエスケープしました。そうしないと、文字クラスが開きます。また、これはパラメーターの 1 文字のみをキャプチャすることに注意してください!

ただし、次preg_replace_callbackのような正規表現でを使用することをお勧めします。

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

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

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

echoあなたのgetSnippetをに変更したことに注意してくださいreturn

コールバック内に$matches[1]は、最初にキャプチャされたグループが含まれます。この場合、これはパラメーターです (複数の文字が許可されるようになりました)。もちろん、 を介してリダイレクトする代わりに、配列からgetSnippetを読み取るように関数を調整することもできます。id$matchesreplaceCallback

ただし、ここでのこのアプローチは、複数の関数にリダイレクトできるため、多少柔軟性があります。例として、正規表現を#\[(getSnippet|otherFunction)\((\w+)\)\]#then に変更すると、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です。

于 2012-10-29T19:12:36.450 に答える