好吧我所拥有的是一个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)":)(.*?)":)(?!,")"(.*?)",
我有两个问题: -
通过简单地跳转到“在下一个字符串中找到的匹配元素”来匹配带有整数和数组的元素。我希望匹配失败并继续前进
我无法让它处理url中的\“所以我需要,在正则表达式的末尾但是然后停止下一个字符串匹配我试过\ G但这似乎没有影响我感觉它是在上一场比赛之后开始的。我还尝试了许多解决方案,假设允许转义文本但这些都无法在我的情况下工作。
我们的想法是,这比将JSON字符串转换为对象更快,然后遍历数百个元素的数组以移除HTML,如果更快,那么我只会这样做,这将更容易
答案 0 :(得分:3)
不要直接使用json,使用json_decode()
对其进行解码。
然后使用HTMLPurifier
清理HTML,这样可以很好地清理HTML代码。
然后使用json_encode()
将数据再次编码为json。
答案 1 :(得分:1)
您的表达式存在一些问题,例如使用.*?
将继续捕获所有字符,直到匹配下一个必需字符为止。我将其替换为[^"]*?
,它将匹配所有非引号,这会强制捕获停止使用引用组之外的字符。
我还为开放引号(["])
创建了一个捕获组,尽管可能过度使用,这样您只需在字符类中添加单引号即可。然后我再次回顾这个捕获的组,以确保匹配正确的相应关闭报价。这样,如果您的输入字符串中不需要打开引号,那么您只需插入一个问号(["])?
,就会自动找到与开放引号匹配的关闭引号。
我还将[{,]
移到了捕获组
这是我清理版的正则表达式
[{,]((")(?!(elements|string3|string4)\2:)([^"]*?)\2:)(")([^"]*?)\5(?=,)
<?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] =>
)
)