preg_replace json字符串匹配相同的字符开头/结尾

时间:2013-06-09 11:58:31

标签: php regex preg-replace

好吧我所拥有的是一个JSON字符串,它可以包含一个或多个元素,下面我举了一个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但这似乎没有影响我感觉它是在上一场比赛之后开始的。我还尝试了许多解决方案,假设允许转义文本但这些都无法在我的情况下工作。

  3. 我们的想法是,这比将JSON字符串转换为对象更快,然后遍历数百个元素的数组以移除HTML,如果更快,那么我只会这样做,这将更容易

2 个答案:

答案 0 :(得分:3)

不要直接使用json,使用json_decode()对其进行解码。

然后使用HTMLPurifier清理HTML,这样可以很好地清理HTML代码。

然后使用json_encode()将数据再次编码为json。

答案 1 :(得分:1)

描述

您的表达式存在一些问题,例如使用.*?将继续捕获所有字符,直到匹配下一个必需字符为止。我将其替换为[^"]*?,它将匹配所有非引号,这会强制捕获停止使用引用组之外的字符。

我还为开放引号(["])创建了一个捕获组,尽管可能过度使用,这样您只需在字符类中添加单引号即可。然后我再次回顾这个捕获的组,以确保匹配正确的相应关闭报价。这样,如果您的输入字符串中不需要打开引号,那么您只需插入一个问号(["])?,就会自动找到与开放引号匹配的关闭引号。

我还将[{,]移到了捕获组

之外

这是我清理版的正则表达式

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

enter image description here

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] => 
        )

)