正規表現にはいくつかの問題があります。
まず、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'
これらのセクションをすべて見つけたい場合は863
、content
とen
変数を作成し、(括弧を使用して) それらをキャプチャし、後方参照を使用して、対応する を確実に取得することができますrecord_end
。
'#/[*]\s*record\s*(\d+)[.](\w+)[.](\w+)\s*[*]/.*?/[*]\s*record_end\s*\1[.]\2[.]\3\s*[*]/#s'