2016-04-27 20 views
-2

それは私がのようなテキスト持っている正規表現-ES を使用してテンプレート解析のような種類を解決することができるかしら含む中括弧でスペースを置き換えるために:PHPの正規表現が括弧

'Hello, {{ Na me|{{Surname }}}}. Would you like some drink? {{CoffeePreferred? We have a special discount for coffee}} {{Tea Preferred? We have a special discount for tea}}' 

まず、私がでエラーを修正する必要があります変数は常に "?"や "|"のような特別な記号に括弧の直後に来なければなりません。あるいは他の何かがコンマやドットであっても将来的にルールを追加することができます。

Na meTea PreferredSurnameは、変数名のスペルミスです。中括弧の後ろにスペースを入れないと、変数名は右から始まります。それ以外の場合はエラーです。

次に、そのままテキストを保持する必要があります。私たちは、お茶のための特別割引を持って

しかし親愛なる友人我々はコーヒーのための特別割引を持っているが、単純なテキストです。

私の質問は、変数でアンダースコアを使用して不要なスペースを置き換えてテキストに保持する方法です。また、できるだけ少ないステップで実行したい(パフォーマンスの影響やテキストのメガバイトがかかるため)。私は私のテキストがあることを期待

'Hello, {{Na_me|{{Surname}}}}. Would you like some drink? {{CoffeePreferred? We have a special discount for coffee}} {{Tea_Preferred? We have a special discount for tea}}' 

私の最初のステップは、中括弧の内容を抽出することでした:

preg_replace_callback(
    '/(\{\{)(.*?)(\}\})/ui', 
    function ($matches) { 
     echo $matches[2]; 
}); 

その後、私は成功しません上記の規則によってスペースを交換しようとしました。私は/[\s](?!<=\|)/のようなアサーションを使用しようとしました。(\s(?!\|))|((?!\|)\s)のような表現はありますか?ここで

+0

あなたは、変数は常に「のような特殊な記号に中括弧の直後に来る '言いますか? "または "|"何か他の何かを意味するのですか? – Toto

+0

与えられた例の結果はどうでしょうか? – Toto

+0

@Toto、 '変数は常に中かっこの後ろに来ます - ルールですが、ユーザーはそれを壊すことができます。この場合、修正する必要があります(' trim'は単純なテンプレートでうまく動作しますが、中括弧に中括弧が含まれていると、 ) 'something else'は、感嘆符が特別な意味を持つように、将来ルールを追加したり変更したりできることを意味します - そのため、すべてのスペースはアンダースコアに置き換えなければなりません。私は質問に結果を追加しました – sly

答えて

1

が仕事をするための方法である。その後

$str = preg_replace_callback(
    '/\{\{([^|?{}]+)/', 
    function ($matches) { 
     $ret = trim($matches[1]); 
     return preg_replace('/ /', '_', $ret); 
    }, 
    $str 
); 

あなたはすべての中括弧を削除することができます。

$str = preg_replace('/[{}]+/', '', $str);