0

たとえば、次のようなテキストがあります。

XYZ id dui vel erat bibendum hendrerit aliquet ac lorem. Integer ABC turpis, facilisis sit amet ultricies non, tempor LMNOP est. Aliquam sit amet sapien justo. Quisque TUV dolor dolor, eu sodales mi.

太字の単語を番号付きのプレースホルダーに置き換える必要があります。

%%%1%%% id dui vel erat bibendum hendrerit aliquet ac lorem. Integer %%%2%%% turpis, facilisis sit amet ultricies non, tempor %%%3%%% est. Aliquam sit amet sapien justo. Quisque %%%4%%% dolor dolor, eu sodales mi.

この置換を行うには、置換するテキスト (XYZ など) を配列に格納し、プレースホルダーの番号 (1 など) をキーにして、後で戻って元の値に戻すことができるようにする必要があります。

難しいのは、置換テキストが事前にわからないことです。そのため、既に置換されているアイテムの現在の数に基づいて生成するコールバックが必要です。

私は古いバージョンの PHP を実行しており、ツールキットで匿名関数を使用できないため、preg_replace_callback. 私の問題は、私が作成した ( を使用してcreate_function) 関数が共有グローバル状態にアクセスできるようにする必要があるという事実に要約されるようです。少なくとも、置き換えられたテキストをプッシュおよびポップできる共有グローバル配列です。スタック。

これは可能ですか?

4

3 に答える 3

1

いつでもクラス メソッドを渡し、インスタンス プロパティを使用できます (コールバック タイプを見てください)。キーワードは、global状況により適している場合にも可能性があります。

于 2011-11-01T23:23:44.233 に答える
1

を使用する代わりにcreate_function()、通常の関数を作成する方が簡単です。(必要な複雑な文字列エスケープを処理する必要がない方が簡単です。)

global $var;グローバルを設定するために使用します。

次に、置換を実行した後、そのグローバルアクセスにアクセスします(置換呼び出しが関数内にある場合は、global $var;そこでも言う必要があります)。

于 2011-11-01T22:33:32.047 に答える
0

PHP 5.3 を使用している場合は、クロージャーを作成し、ローカル スコープのデータをコールバック内にインポートできます。これにより、コールバックが必要なデータにアクセスできるようにしながら、グローバル データの乱雑さを回避できます。簡単な例については、以下を参照してください

<?php
// The data you want to use in your function
$data = array(/* ... whatever ... */);

$val = preg_replace_callback('/regex/', function ($matches) use ($data) {
    /* do stuff here with $data and $matches */
});
?>
于 2011-11-01T22:41:48.653 に答える