1

わかりましたので、私が持っているのは 1 つまたは多くの要素を含むことができる JSON 文字列です。以下に文字列の例を示しますが、これは実際の文字列がはるかに複雑な例にすぎません。この 1 つのハイライトは、私が抱えている問題です。

{"elements":[{"id":2,"string":"something","string2":"","string3":"no html  here","integer":2,"array":{"options":[{"id":1,"value":"data"},{"id":2,"value":"more data"}]},"string4":"text with <a href=\"http:\/\/www.example.com\">html<\/a>","string5":"naughty <a href=\"http:\/\/www.example.com\">link<\/a>"},{"id":2,"string":"something","string2":"","string3":"no html here","integer":2,"array":{"options":[{"id":1,"value":"data"},{"id":2,"value":"more data"}]},"string4":"text with <a href=\"http:\/\/www.example.com\">html<\/a>","string5":"naughty <a href=\"http:\/\/www.example.com\">link<\/a>"}]}

私がやろうとしているのは、JSON データ内のすべての文字列 (名前ではなくデータ型) を照合し、HTML が許可されているかどうかに応じて (ブラックリストを使用して) HTML を削除することです。私は正規表現の専門家ではないので、何が問題なのかわかりません。

これが私の正規表現です:-

([{,]"(?!(elements|string3|string4)":)(.*?)":)(?!,")"(.*?)",

私はそれに2つの問題があります:-

  1. 次の文字列内で見つかった " にジャンプするだけで、整数と配列の両方で要素を一致させます。一致が失敗して次に進むことを期待していました

  2. URL の \" を処理することができないので、正規表現の最後に , が必要ですが、これは \G を試した次の文字列の一致で停止しますが、これは影響がないように見えました。の後に、前の試合で、エスケープされたテキストを許可すると思われる多くのソリューションも試しましたが、これらはすべて私の場合は機能しませんでした。

これは、JSON 文字列をオブジェクトに変換し、数百の要素の配列をトラバースして HTML を削除するよりも高速であると考えられていました。

4

2 に答える 2

3

json を直接操作しないでください。 を使用してデコードしてjson_decode()ください。

次にHTMLPurifier、 を使用して HTML をクリーンアップします。これは、HTML コードのクリーンアップに優れています。

次に、 を使用してデータを json に再度エンコードしますjson_encode()

于 2013-06-09T12:03:42.333 に答える
1

説明

.*?を使用すると、次の必要な文字が一致するまですべての文字がキャプチャされ続けるなど、式にいくつかの問題がありました。これを、引用符以外のすべてに一致するものに置き換えました。これにより[^"]*?、キャプチャは、引用符で囲まれたグループ外の文字の消費を強制的に停止します。

また、開始引用符のキャプチャ グループも作成しましたが、(["])これにより、文字クラスに一重引用符を追加するだけで済みます。次に、このキャプチャされたグループを後で参照して、対応する適切な終了引用符も一致することを確認します。このように、入力文字列に開始引用符が必要ない場合は、疑問符を挿入するだけ(["])?で、開始引用符に一致する終了引用符が自動的に検出されます。

[{,]また、キャプチャ グループの外に移動しました

これは正規表現のクリーンアップされたバージョンです

[{,]((")(?!(elements|string3|string4)\2:)([^"]*?)\2:)(")([^"]*?)\5(?=,)

ここに画像の説明を入力

PHP コード例:

<?php
$sourcestring="your source string";
preg_match_all('/[{,]((")(?!(elements|string3|string4)\2:)([^"]*?)\2:)(")([^"]*?)\5(?=,)/i',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>
 
$matches Array:
(
    [0] => Array
        (
            [0] => ,"string0":"something0"
            [1] => ,"string1":""
            [2] => ,"string":"something"
            [3] => ,"string5":""
        )

    [1] => Array
        (
            [0] => "string0":
            [1] => "string1":
            [2] => "string":
            [3] => "string5":
        )

    [2] => Array
        (
            [0] => "
            [1] => "
            [2] => "
            [3] => "
        )

    [3] => Array
        (
            [0] => 
            [1] => 
            [2] => 
            [3] => 
        )

    [4] => Array
        (
            [0] => string0
            [1] => string1
            [2] => string
            [3] => string5
        )

    [5] => Array
        (
            [0] => "
            [1] => "
            [2] => "
            [3] => "
        )

    [6] => Array
        (
            [0] => something0
            [1] => 
            [2] => something
            [3] => 
        )

)
于 2013-06-09T16:21:45.517 に答える