php预替换

php预替换,php,regex,preg-replace,Php,Regex,Preg Replace,在处理写得不好的xml时,我试图构建一个PHP preg replace字符串,这样,如果给我: $x='<abc x="y"><def x="g">more test</def x="g"><blah>test data</blah></abc x="y">'; $x='moretesttestdata'; 它检查结束标记中是否有空格,并删除从空格到标记末尾的所有内容,以便 变成 <abc x="y">&l

在处理写得不好的xml时,我试图构建一个PHP preg replace字符串,这样,如果给我:

$x='<abc x="y"><def x="g">more test</def x="g"><blah>test data</blah></abc x="y">';
$x='moretesttestdata';
它检查结束标记中是否有空格,并删除从空格到标记末尾的所有内容,以便

变成

<abc x="y"><def x="g">more test</def><blah>test data</blah></abc>
更多测试数据

谢谢

在这种情况下,正则表达式实际上可能是可行的:

$xml = preg_replace("#(</(\w+:)?\w+)\s[^>]+>#", "$1>", $xml);
$xml=preg#u replace(“[+>”,“$1>”,$xml);
编辑:根据@netcoder的提示进行修复。在垃圾之前强制使用空格

明显的缺陷当然是注释(对于数据XML来说不太可能)和CDATA部分(从XML的外观来看也不太可能)

尽管您仍然可以尝试QueryPath,但它应该也可以与XML一起使用,并且在这些情况下可能具有弹性。它是如何被篡改的?

preg\u replace('/]+>/','$string);
preg_replace('/<\/(.*?)\s+[^>]+>/', '</$1>', $string);
编辑:经过测试,有效。

这应该可以做到:

preg_replace('/<\/(\w+)\s*[^>]*>/', '</\1>', $x);
preg_replace('/]*>/',''$x);
试试:

preg\u replace(“/您还可以使用:

以下是@Jonah的例子:

pattern('<\/(.*?)\s+[^>]+>')->replace($string)->all()->withReferences('</$1>');
pattern(']+>)->replace($string)->all()->withReferences('');

注意,将
与()一起使用
会引用占位符。

类似这样的内容?你忘记了替换位置周围的大括号。如果字符在结束标记中没有属性,这一个将删除字符。例如:
bar
将变成
bar
。说来话长。但这就是我得到的。xml不会有注释或CDATA。@David:实际上看起来像是这样类似于一些更简单的xml生成代码的常见问题。我也看到过类似的情况。这实际上几乎可以工作,但如果数据值中有空格,则会失败-然后它会删除xml结束标记,留下错误的“>”。
pattern('<\/(.*?)\s+[^>]+>')->replace($string)->all()->withReferences('</$1>');