2

これは多かれ少なかれ2つの部分からなる質問だと思いますが、最初に基本的なことを説明します。preg_match_allを使用して、{}でブックエンドの文字列の変数を調べるPHPを作成しています。次に、返された各文字列を繰り返し処理し、見つかった文字列をMySQLクエリのデータに置き換えます。

最初の質問はこれです:PCRE式の詳細を実際に学ぶための良いサイトはありますか?私はGoogleで多くの検索を行いましたが、これまでに見つけた中で最高のものはhttp://www.regular-expressions.info/です。私の意見では、そこにある情報はよく整理されておらず、複雑な正規表現を書く必要があるときに助けを求めてハングアップしたくないので、いくつかのサイト(またはいくつかの本!)を教えてくださいそれは私が将来あなたたちを煩わせる必要がないのを助けるでしょう。

2番目の質問はこれです:私はこの正規表現を持っています

"/{.*(_){1}(.*(_){1}[a-z]{1}|.*)}/"

などのインスタンスをキャッチするために必要{first_name}, {last_name}, {email}です。この正規表現には3つの問題があります。

1つ目は、「{first_name} {last_name}」を2つの文字列として表示する必要があるのに、1つの文字列として表示することです。空間の存在を確認し、空間を爆発させることで、これを解決することができました。散らかっていますが、動作します。

2番目の問題は、キャプチャされた文字列の一部として句読点が含まれていることです。したがって、「{first_name} {last_name}、」がある場合は、文字列の一部としてコンマが返されます。preg_replaceを使用してピリオド、コンマ、セミコロンを削除するだけで、これを部分的に解決することができました。これらの句読点では機能しますが、私のロジックでは感嘆符、疑問符、その他すべてを処理できません。

この正規表現で私が抱えている3番目の問題は、{email}のインスタンスがまったく表示されないことです。

さて、できれば、喜んで、そしてこの問題の解決策を私に手渡す時間があれば、それが私の差し迫った問題を解決するので、ありがとうございます。ただし、これができる場合でも、参考資料として優れたWebサイトを提供するlmgftyや、このテーマに関する優れた教育を提供する1冊または2冊の本を提供してください。お金が逼迫しているのでサイトが望ましいですが、本が解決策であれば、私はお金を見つけます(私の地元の図書館システムがその量を調達できないと仮定して)。

4

3 に答える 3

3

当時、私はPHP独自のPCRE構文リファレンスが非常に優れていることに気付きました:http://uk.php.net/manual/en/reference.pcre.pattern.syntax.php

あなたの表現について話しましょう。必要以上に冗長です。これを実行する間、単純化するつもりです。

一致させようとしているものを確認するためのかなり簡単な方法:「を見つけて{から、任意の数の文字またはアンダースコアを見つけてから、}」。そのための正規表現は(PHPのstring-y構文で)次のとおりです。'/\{[a-z_]+\}/'

これは、すべての例に一致しますが、のようないくつかのよりワイルドな例にも一致します{__a_b}。それがオプションでない場合は、もう少し複雑な説明を使用できます。「、を見つけて{から文字の束を見つけ、次に(できるだけ頻繁に)アンダースコアを続けて文字の束を見つけ、次に}」。正規表現では:/\{([a-z]+(_[a-z]+)*\}/

この2つ目は、もう少し説明が必要かもしれません。セグメントに一致するものを繰り返したいので_foo、括弧で囲む必要があります。次に、これをできるだけ頻繁に見つけてみてください。ただし、まったく見つからなくても問題ありません(これがの意味です*)。

これで、あなたの試みと比較できるものができたので、問題の原因を見てみましょう。

  • あなたの表現は、とや他の多くのもの{}を含む}、内のすべての文字と一致します{。言い換えると、の{abcde{_fgh}ように、正規表現によって受け入れられます{abcde} fg_h {ijkl}
  • _最初の直後に、そこに必須があり.*ます。((_){1}とはまったく同じ意味です_)は次のように述べています。何が起こっても、これがここにない場合は爆発します。明らかに、それは決して一致しないので、実際には必要ありません{email}

正規表現が一致するもののわかりやすい言葉での完全な説明は次のとおりです。

  1. に一致し{ます。
  2. に一致し_ます。
  3. その直後に残りのすべてのルールに一致することができる限り、絶対にすべてに一致します。
  4. に一致し_ます。
  5. 1文字に一致します。
  6. _それと一文字の代わりに、絶対に何でも大丈夫です。
  7. に一致し}ます。

これはおそらくあなたが望んでいたものからかなり遠いです。ただし、心配しないでください。正規表現に慣れるまでには少し時間がかかります。正規表現を作成するときは、「これを見つけてから、それを見つける」などのように頭の中で作成してみてください。次に、達成するための正しい構文を見つけてください。まさにその通りです。

これは主に、頭の中で思いついたすべての指示が正規表現の一部に簡単に変換されるわけではないためです...しかし、そこで経験が生まれます。すぐにそれを理解できることを約束します。 ...最初に正規表現を作成することについてかなり系統だった場合。

幸運を!:)

于 2012-06-04T20:35:11.993 に答える
1

PCREの場合、PCREのマンページを単純に消化しましたが、とにかく私の脳はそのように機能します...

区切られたもののマッチングに関しては、一般的に2つのアプローチがあります。

  1. 最初の区切り文字と一致し、終了区切り文字以外のものと一致し、終了区切り文字と一致します。
  2. 最初の区切り文字と一致し、不規則に一致し、最後の区切り文字と一致します。

例:あなたの場合:

  1. \{([^}]+)\}
  2. \{(.+?)\}- ?に注意してください +の後

抽出したいコンテンツの周りにもグループを追加しました。

特に#1の場合だけでなく、#2の場合も、「ドットが何かに一致する」が有効になっている場合(ドットオール、シングルライン、またはお気に入りの正規表現フレーバーで呼ばれるもの)、それらは内の改行にも一致することに注意してください。それが問題になる場合は、それと不要なものを手動で除外する必要があります。ホワイトリストアプローチのようなものが必要な場合は、上記の回答を参照してください。

于 2013-02-05T02:27:19.450 に答える
0
  1. これが良い正規表現サイトです。
  2. 動作するPCRE正規表現は次のとおりです。\{\w+\}

仕組みは次のとおりです。基本的に{は、その後に続くone ore more word charactersを探してい}ます。興味深いのは、文字クラスという単語に実際にはアンダースコアも含まれていることです。\w本質的には略記です[A-Za-z0-9_]

したがって、基本的に中括弧内のこれらの文字の任意の組み合わせに一致し、プラス記号があるため、空でない中括弧にのみ一致します。

于 2014-11-21T03:00:12.243 に答える