2016-12-26 8 views
1

PHPの正規表現に問題があります。私が達成しようとしているのは、文字列内にプレースホルダトークンを置き、それを値に置き換えることです。正規表現 - すべてをXから次のYまでキャプチャします。

私は次の構文を使用しています。正規表現を少し経験を持つ

Hello {{ username }}! Your order ID is {{ order }}.

、私はRegex101のオンライン正規表現のテスト環境を使用して、次の式を思い付きました。私は、単一の行に複数のトークンを使用して式の巨大な欠陥を実現するまで、うまく働いた

({{(?:.*?)(?:property)(?:.*?)}}) 

。私は表現がどのように評価されているのかを理解しており、下の画像に私の理解でラベルを付けました(私が間違っていれば私を修正します)。

enter image description here

私は遠く離れので、任意のヘルプは高く評価され、私が達成しようとしているが、私は途方に暮れてよ何からではないと思うしたいと思います。

パターンに含まれるトークン内のプロパティ名が必要です。プロパティの上の画像では、emailです。

ありがとうございました!

Regex101:https://regex101.com/r/7Ezep5/1

+0

@ chris85 - 投稿をRegex101の例へのリンクで更新しました。 – connorb

+1

正しいPHP変数を使用するのではなく、なぜこのひどい構文を使用しているのかと聞かれますか? – junkfoodjunkie

+0

https://regex101.com/r/7Ezep5/2のようなやり方で 'preg_replace_callback'を使って値があなたのプロパティであるかどうかを調べることができます。 – chris85

答えて

1

短い答え:

.は何も(しかし、新しい行)と一致します。 }以外のものを意味する[^}]に変更してください。同様に

({{(?:[^}]*?)(?:email)(?:[^}]*?)}}) 

e.e.e.文字列email}の前に見つからない場合は失敗します。

Check this updated regex101

+0

素晴らしいです、これは完全にありがとうございます! – connorb

+1

実際には、プロパティ名を包括的に完全に一致させる必要もあります。したがって、Regex101の例では、 'contact_email'と一致してはいけませんが、プロパティとして' email'を持つトークンと一致します。どうすればこれを達成できますか? – connorb

+0

あなたの答えを次のように変更して、私が達成しようとしているものを手に入れました:({{(?:[^}] *?)\ b(?:email)\ b(?:[^}] *?)}}) '。 – connorb

関連する問題