2

関数を実行する preg_replace を使用して bbCode システムを作成しようとしましたが、'e' 修飾子を追加したにもかかわらず、何らかの理由で出力が $1 になっています。

これを解決する方法はありますか?

ソースコード:

            function bbcode($value){
                $pattern[0] = "/\{register\}(.*?)\{\/register\}/sie";
                $replace[0] = register('$1'); //"<pre>$1</pre>";
                $bbcoded = preg_replace($pattern, $replace, $value);
                return $bbcoded;
            }

            function register($var) {
                echo $var;
            }

            $content = '
                {b}text{/b}
                {register}
                    "register" = "setting",
                    "name" = "title",
                    "order" = "1"
                {/register}
                some text
                {register}
                    "register" = "setting",
                    "name" = "url",
                    "order" = "3"
                {/register}
                some more {b}t{/b}e{b}xt{/b}
                {register}
                    "register" = "setting",
                    "name" = "description",
                    "order" = "2"
                {/register}
                text text
            ';

            $content = bbcode($content);

実際の動作をご覧ください: http://sandbox.onlinephpfunctions.com/code/08459c4fec1919e6089d3849e154ba7a83900fd7

4

2 に答える 2

2

preg_replace_callback()代わりに次を使用する必要があります。

 $pattern = "/\{register\}(.*?)\{\/register\}/si"; // NO /e modifier!
 $bbcoded = preg_replace_callback($pattern, 'register', $value);

 function register($var) 
 {
     // $var[0] is the whole match
     // $var[1] is the part between {register} and {/register}

     // whatever you return here will be the replacement string
     return $var[0];
 }

の 2 番目のパラメータpreg_replace_callback()は、見つかったすべての一致で実行されるcallableであり、その戻り値が置換として使用されます。

アップデート

置換の構文は次の/eようになります (全体が文字列である必要があります)。

$bbcoded = preg_replace_callback($pattern, "register('$1')", $value);
于 2012-12-17T16:23:15.527 に答える
1

基本的なphp構文...

            $replace[0] = register("$1"); //"<pre>$1</pre>";
                                   ^--^--

引用符に使用する文字列'は、変数を補間しません。同様に、register()関数は渡された値をECHOING$register[0]します。そのため、レジスタ関数の戻り値になり、null になります。レジスタは何も返しません。

于 2012-12-17T16:21:41.753 に答える