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

Php preg_replace json字符串匹配相同的字符开头/结尾,php,regex,preg-replace,Php,Regex,Preg Replace,好的,我有一个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"}]},"st

好的,我有一个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>"}]}
我有两个问题:-

  • 它通过跳转到下一个字符串中的“find”来匹配整数和数组中的元素。我希望匹配失败并继续

  • 我无法让它处理url中的\“,所以我需要,在正则表达式的末尾,但这是下一个字符串匹配,我尝试了\G,但这似乎没有影响,我有一种感觉,它在前一个匹配中,在之后开始。我还尝试了一些本应允许转义文本的解决方案,但在我的案例中,这些都失败了


  • 我们的想法是,这比将JSON字符串转换为对象,然后遍历数百个元素的数组来删除HTML要快得多。如果这更快的话,我就这么做,这会简单得多。

    不要直接处理JSON,使用

    然后使用清理HTML,这在清理HTML代码方面做得很好


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

    不要直接处理json,请使用进行解码

    然后使用清理HTML,这在清理HTML代码方面做得很好

    然后使用.

    Description再次将数据编码为json 表达式有几个问题,例如使用
    *?
    将继续捕获所有字符,直到匹配下一个所需字符。我将其替换为将匹配所有非引号的
    [^”]*?
    ,这将强制捕获停止使用引号组之外的字符

    我还为openquotes
    ([“])
    创建了一个捕获组,尽管这可能有点过分,它允许您只向character类添加一个引号。然后,我稍后再参考这个捕获的组,以确保正确的对应结束报价也匹配。这样,如果输入字符串中不需要打开引号,则只需插入问号
    ([“])?
    ,即可自动找到与打开引号匹配的关闭引号

    我还将
    [{,]
    移动到捕获组之外

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

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

    我还为openquotes
    ([“])创建了一个捕获组
    尽管这可能有点过分,但它允许您只向字符类添加一个引号。然后我稍后再引用此捕获的组,以确保匹配正确的对应结束引号。这样,如果输入字符串中不需要打开引号,则您可以简单地插入问号
    ([“])?
    并且将自动找到与开放报价匹配的结束报价

    我还将
    [{,]
    移动到捕获组之外

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

    PHP代码示例:
    只是一个问题:你听说过吗?只是一个问题:你听说过吗?
    
    ([{,]"(?!(elements|string3|string4)":)(.*?)":)(?!,")"(.*?)",
    
    <?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] => 
            )
    
    )