0

正規表現を使用していくつかの入力を解析しようとしています。入力は次の形式になります。

{somevalue:3}

目的は、「som」(引用符なし)を表示することです。

現在、私は次のことを行っています。

 'echo' => array(
            'search' => '~\{((?:'.$this->preg['var'].')(?:\.)?)\}~sU',
            'replace' => "'.\$this->_get('\\1').'"
        )

これは私のテンプレートシステムでうまく機能し、標準変数(つまり「somevalue」)をエコーし​​ます。ただし、ユーザーが:delimiterを使用して、出力する文字数を制限できるようにしたいと思います(つまり、{somevalue:3}は'som'を表示します)。

私は試した:

'echo' => array(
            'search' => '~\{((?:'.$this->preg['var'].')(?:\.)?:(.*)/)\}~sU',
            'replace' => "'.substr(\$this->_get('\\1'),0,\\2).'"
        )

しかし、これはうまくいきませんでした。私は正規表現が正直であるとは本当に理解していませんので、どんな助けでも大歓迎です。

4

2 に答える 2

0

新しい検索式に余分な「/」があるようです。

                                                       |
                                                       v
'search' => '~\{((?:'.$this->preg['var'].')(?:\.)?:(.*)/)\}~sU',

使用しているテンプレートシステムについてはよくわかりませんが、replace式も変更する必要があるようです。

'replace' => "'.substr(\$this->_get('\\1'),0,\$this->_get('\\2')).'"

これらを組み合わせると、次のようなものを試すことができます。

'echo' => array(
            'search' => '~\{((?:'.$this->preg['var'].')(?:\.)?:(.*))\}~sU',
            'replace' => "'.substr(\$this->_get('\\1'),0,\$this->_get('\\2')).'"
        )

これが機能する場合、入力を行う古い方法は機能しなくなることに注意してください。{<string>:<num_of_chars>}つまり、。だけでなく、常にフォーマットを使用する必要があります{<string>}

于 2012-11-20T13:24:44.560 に答える
0
$s = preg_replace_callback(
       '/\{([^:]+):(\d+)\}/',
       create_function('$m', 'return substr($m[1], 0, $m[2]);'), $s);

ここでこのコードをテストします。

于 2012-11-20T13:35:37.407 に答える