11

角かっこ内で一部のタグを使用できるユーザー入力があります。括弧内にあるものを見つけて検証するための正規表現パターンを既に作成しました。

ユーザー入力フィールドでは、開始ブラケット ([) をバックスラッシュでエスケープできます。また、バックスラッシュを別のバックスラッシュ (\) でエスケープできます。開き括弧の前に奇数個の連続するバックスラッシュを避けるために、後読みサブパターンが必要です。

現時点では、次のようなことに対処する必要があります。

(?<!\\)(?:\\\\)*\[(?<inside brackets>.*?)]

正常に動作しますが、問題は、このコードがまだブラケットの前にある連続するバックスラッシュの可能なペアに一致し (それらが隠されている場合でも)、ペアに追加された別の単一のバックスラッシュがあるかどうか (または開始ブラケットに直接) をチェックアウトすることです。 . 可能であれば、後読みグループ内でそれらをすべて回避する必要があります。

例:

my [test] string is ok
my \[test] string is wrong
my \\[test] string is ok
my \\\[test] string is wrong
my \\\\[test] string is ok
my \\\\\[test] string is wrong
...
etc

私はPHP PCREを使用しています

4

2 に答える 2

11

前回確認したとき、PHP は可変長の後読みをサポートしていませんでした。そのため、簡単な解決策を使用することはできません(?<![^\\](?:\\\\)*\\)

最も簡単な回避策は、括弧部分だけでなく、全体を単純に一致させることです。

(?<!\\)((?:\\\\)*)\[(?<inside_brackets>.*?)]

違いは、その正規表現を で使用している場合は、置換文字列の前に を付けて、そこにあるバックスラッシュを復元することpreg_replaceを忘れないでください。$1

于 2012-03-08T06:42:31.950 に答える
0

後読みなしでそれを行うことができます(交互は単一のバックスラッシュ以外のものを食べます(\\\\|[^\\])

^(\\\\|[^\\])*\[(?<brackets>.*?)\] 
于 2012-03-08T10:29:33.640 に答える