【问题标题】:php preg replacephp preg_replace
【发布时间】:2019-01-04 23:30:52
【问题描述】:

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

$x='<abc x="y"><def x="g">more test</def x="g"><blah>test data</blah></abc x="y">';

它检查结束标记中是否有空格,并删除从空格到标记末尾的所有内容。

变成

<abc x="y"><def x="g">more test</def><blah>test data</blah></abc>

谢谢

【问题讨论】:

标签: php regex preg-replace


【解决方案1】:

应该这样做:

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

【讨论】:

    【解决方案2】:

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

    $xml = preg_replace("#(</(\w+:)?\w+)\s[^>]+>#", "$1>", $xml);
    

    编辑:根据@netcoder 的提示修复。在垃圾之前强制空间。

    明显的缺陷当然是 cmets(不太可能用于数据 XML)和 CDATA 部分(从您的 xml 的外观来看也不太可能)。

    尽管您仍然可以尝试使用 QueryPath,但它也应该可以与 XML 一起使用,并且可能对这些情况具有弹性。到底是怎么弄成乱码的?

    【讨论】:

    • 如果字符在结束标签中没有属性,这个会删除字符。例如:&lt;foo&gt;bar&lt;/foo&gt; 将变为 &lt;foo&gt;bar&lt;/fo&gt;
    • 说来话长。但这就是我得到的。 xml 不会有 cmets 或 CDATA。
    • @David:实际上看起来像是一些更简单的 xml 生成代码的常见问题。也见过这样的。
    【解决方案3】:
    preg_replace('/<\/(.*?)\s+[^>]+>/', '</$1>', $string);
    

    编辑:经过测试,有效。

    【讨论】:

    • 这实际上几乎可以工作,但如果数据值中有空格,则会失败 - 然后它会删除 xml 结束标记,留下错误的 '>' 。
    【解决方案4】:

    试试:

    preg_replace("/<\/((\w)([^<].*)?)\>/","</$2>",$x);
    

    代码未测试

    【讨论】:

    • 您忘记了替换件周围的大括号。
    【解决方案5】:

    你也可以使用T-Regx library:

    这是@Jonah 的例子:

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

    PS:注意使用with() 会引用占位符。

    【讨论】:

      猜你喜欢
      • 2011-01-14
      • 2013-08-03
      • 1970-01-01
      • 2013-07-17
      • 2015-09-22
      • 2010-12-10
      • 2012-02-11
      • 2011-08-24
      相关资源
      最近更新 更多