2

私は次のコードを持っています:

/* record 863.content.en */
UPDATE language_def
SET en='<html>blah blah markup</html>'
WHERE page_id=863,
AND string_id='content';
/* record_end 863.content.en */

そのステートメントに一致する式を作成したいと思います。ここで、

  1. の期間の間のデータ863.content.enは可変ですが、特定です(これらのステートメントの多くが連続して存在します)
  2. 2つのコメントの間のデータは可変ですが、具体的ではありません

これは私がこれまでに持っているものです:

'[/*]\s*record\s*specific_number[.]specific_string1[.]specific_string2\s*[*/].*[/*]\s*record_end\s*specific_number[.]specific_string1[.]specific_string2\s*[*/]'
4

2 に答える 2

0

正規表現にはいくつかの問題があります。

まず、FrankeTheKneeMan が指摘したように、区切り記号が必要です。#は、HTML の一致に適しています (標準的な選択です/が、タグに頻繁に干渉します)。

'#[/*]\s*record\s*specific_number[.]specific_string1[.]specific_string2\s*[*/].*[/*]\s*record_end\s*specific_number[.]specific_string1[.]specific_string2\s*[*/]#'

while[.]は単一の文字をエスケープする良い方法ですが、 に対しては同じようには機能しません[/*]/これは、 または のいずれかに一致する文字クラス*です。についても同じです[*/]。代わりにこれを使用してください:

'#/[*]\s*record\s*specific_number[.]specific_string1[.]specific_string2\s*[*]/.*/[*]\s*record_end\s*specific_number[.]specific_string1[.]specific_string2\s*[*]/#'

さて.*、残りの問題です。実際にもありますが、一方は重要で、もう一方はそうではないかもしれません。1 つ目は、.デフォルトでは改行に一致しないことです。sこれは、 (singleline) 修飾子を使用して変更できます。二つ目*は貪欲です。セクションが文字列に 2 回表示される場合、間に関係のないものがあっても、最初の対応するものから/* record最後の対応するものまですべてを取得します。/* record_endあなたの記録は非常に具体的であるように見えるので、そうではないと思います。しかし、量指定子を非貪欲にすることは、消費量をできるだけ少なくするために一般的には良い習慣です。最終的な正規表現文字列は次のとおりです。

'#/[*]\s*record\s*specific_number[.]specific_string1[.]specific_string2\s*[*]/.*?/[*]\s*record_end\s*specific_number[.]specific_string1[.]specific_string2\s*[*]/#s'

提示された例では、これは

'#/[*]\s*record\s*863[.]content[.]en\s*[*]/.*?/[*]\s*record_end\s*863[.]content[.]en\s*[*]/#s'

これらのセクションをすべて見つけたい場合は863contenten変数を作成し、(括弧を使用して) それらをキャプチャし、後方参照を使用して、対応する を確実に取得することができますrecord_end

'#/[*]\s*record\s*(\d+)[.](\w+)[.](\w+)\s*[*]/.*?/[*]\s*record_end\s*\1[.]\2[.]\3\s*[*]/#s'
于 2012-11-20T22:22:53.450 に答える
0
'#/\* record (\S+) \*/.*<html>(.*)</html>.*/\* record_end \1 \*/#is'

この正規表現は、ここで見られるように、文字列を個々のレコードに分割します。任意のスペースを自由に に置き換えることができますが\s*、読みやすくするためにこのようにしました。 \S+任意の数の非空白文字に一致しますが、必要に応じて特定の文字列に置き換えることができます。それ以外の場合は、preg_match_all によって返された一致オブジェクトを解析し、最初のサブキャプチャを使用して特定のレコードを取得し、2 番目のサブキャプチャを使用してhtmlタグ間の情報を取得できます。#s は、php が正規表現を区切るために必要な区切り文字です。i大文字と小文字を区別せず、改行を一致sさせるために使用されます。.

于 2012-11-20T22:23:12.763 に答える