2

/*...*/JSON データからすべてのスタイル コメントを削除する必要があります。文字列値が次のようになるように正規表現で行うにはどうすればよいですか

{
    "propName": "Hello \" /* hi */ there."
}

相変わらず?

4

1 に答える 1

5

最初に、バックトラック制御動詞SKIPおよびFAIL (またはキャプチャ)を使用して、二重引用符で囲まれたすべてのコンテンツを回避する必要があります。

$string = <<<'LOD'
{
    "propName": "Hello \" /* don't remove **/ there." /*this must be removed*/
}
LOD;

$result = preg_replace('~"(?:[^\\\"]+|\\\.)*+"(*SKIP)(*FAIL)|/\*(?:[^*]+|\*+(?!/))*+\*/~s', '',$string);

// The same with a capture:

$result = preg_replace('~("(?:[^\\\"]+|\\\.)*+")|/\*(?:[^*]+|\*+(?!/))*+\*/~s', '$1',$string);

パターンの詳細:

"(?:[^\\\"]+|\\\.)*+"

この部分では、引用符内の可能なコンテンツについて説明します。

"              # literal quote
(?:            # open a non-capturing group
    [^\\\"]+   # all characters that are not \ or "
  |            # OR
    \\\.)*+    # escaped char (that can be a quote)
"

次に、このサブパターンを(*SKIP)(*FAIL)orで失敗させることができます(*SKIP)(?!)パターンが後で失敗した場合、 SKIPはこの時点より前のバックトラッキングを禁止します。FAILはパターンを強制的に失敗させます。したがって、引用部分はスキップされます (後でサブパターンを失敗させるため、結果には含まれません)。

または、キャプチャ グループを使用して、置換パターンに参照を追加します。

/\*(?:[^*]+|\*+(?!/))*+\*/

コメント内の内容を記述します。

/\*           # open the comment
(?:           
    [^*]+     # all characters except *
  |           # OR
    \*+(?!/)  # * not followed by / (note that you can't use 
              # a possessive quantifier here)
)*+           # repeat the group zero or more times
\*/           # close the comment

s 修飾子は、バックスラッシュが引用符内の改行の前にある場合にのみ使用されます。

于 2013-11-11T15:47:08.890 に答える