PHP正则表达式:删除/替换XML属性中的引号 请从XML文件(由第三方源生成)考虑以下行:

PHP正则表达式:删除/替换XML属性中的引号 请从XML文件(由第三方源生成)考虑以下行:,php,regex,Php,Regex,正如您所看到的,属性data\u value在值中引用了字符串,这会导致XML验证器咯咯地笑并爆炸 任何给定的XML文件都可能有数千行。有没有办法将正则表达式应用于整个文件?还有,用更温和的方式替换引号,正则表达式会是什么呢?可能还有其他更好的解决方案,但我就是这样做的: 与某些正则表达式一起使用以捕获所有匹配项,并将它们存储在数组中。$matches[0] :(?)将捕获数据值=“和”/>)之间的所有内容,通过使用正数,精确匹配每个数据值属性的值 循环浏览$matches[0]中的项目,然后

正如您所看到的,属性
data\u value
在值中引用了字符串,这会导致XML验证器咯咯地笑并爆炸


任何给定的XML文件都可能有数千行。有没有办法将正则表达式应用于整个文件?还有,用更温和的方式替换引号,正则表达式会是什么呢?

可能还有其他更好的解决方案,但我就是这样做的:

  • 与某些正则表达式一起使用以捕获所有匹配项,并将它们存储在数组中。
    $matches[0]
  • (?)
    将捕获
    数据值=“
    ”/>)之间的所有内容,通过使用正数,精确匹配每个
    数据值
    属性的值
  • 循环浏览
    $matches[0]
    中的项目,然后执行以下操作:
  • %
    替换每个匹配中的每个双qoutes字符串
    [可以是任何其他字符串,即使是空的,也不会导致进一步的问题],并将其存储在临时变量
    $str
  • 然后将整个数据字符串中每个匹配的值替换为修改后的匹配版本的值,即
    $str
    字符串
PHP代码:
请记住,因为数据是xml标记,所以需要使用“查看源代码”来查看输出,或者,您可以使用
var\u dump
而不是
echo


使用下面的正则表达式,您可以分别匹配这些双引号以进行进一步修改:

(?:="|"\s+(?:\w+="|\/>))(*SKIP)(?!)|"
每次比赛成功后,你们都要强迫引擎跳过轮换的第一面

PHP代码(删除引号):


这是一个很好的例子,从未听说过这个
(*SKIP)(?!)
之前,投票结果不错!哇…SKIP很酷。我是REGEX的新手,所以对我来说一切都像魔术一样…但这是我第一次看到SKIP。谢谢你的回答!@revo,看起来开始标签中的引用也被捕获了。这个演示有更多详细的数据要看。你可能想把REGEX中的
\/>
部分改为[\/?]>
@TomSawyer将
\s+
更改为
\s*
。非常感谢。我将在解析之前研究如何将其应用于每个文件。不客气,我很高兴它能帮上忙。享受编码!对于新的xml数据示例,请使用此正则表达式
(?如果您只想捕获第二个
数据值
,请使用
(?)
相反,
(?:="|"\s+(?:\w+="|\/>))(*SKIP)(?!)|"
echo preg_replace('~(?:="|"\s+(?:\w+="|\/>))(*SKIP)(?!)|"~', '', $xml);