1

好的,我所拥有的是一个 JSON 字符串,它可以包含 1 个或多个元素,下面我放了一个 sting 的例子,但这只是一个例子,真正的字符串要复杂得多。这个亮点是我遇到的问题。

{"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)":)(.*?)":)(?!,")"(.*?)",

我有两个问题:-

  1. 它通过简单地跳转到在下一个字符串中找到的 " 来匹配具有整数和数组的元素。我希望匹配失败并继续前进

  2. 我无法让它处理 url 中的 \" 所以我需要 , 在正则表达式的末尾,但这然后停止是我尝试过的下一个字符串匹配 \G 但这似乎没有影响我有一种感觉它开始了在上一场比赛中,在 , 之后。我还尝试了一些假设允许转义文本的解决方案,但这些都不适用于我的情况。

当时的想法是,这比将 JSON 字符串转换为对象然后遍历数百个元素的数组以删除 HTML 更快,如果这样更快,那么我就这样做会容易得多。

4

2 回答 2

3

不要直接处理 json,使用json_decode().

然后使用 清理您的 HTML HTMLPurifier,它在清理 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 回答