1

我正在尝试使用 preg_replace 仅在标签之间替换 - 到 _

测试字符串通常在 POST 请求的标头响应中收到

  $response['body'] = <<<STR
    <?xml version="1.0"?>
        <tracking-events>
        <tracking-event>
        <type>DELIVERED</type>
        <time>2012-12-04T11:45:08.554+0200</time>
        <tracking-id>AB10000</tracking-id>
        </tracking-event>
        </tracking-events>
    STR;

你能帮我把 - 改成 _ 并保持日期格式不变吗

$response['body'] = <<<STR
<?xml version="1.0"?>
    <tracking_events>
    <tracking_event>
    <type>DELIVERED</type>
    <time>2012-12-04T11:45:08.554+0200</time>
    <tracking_id>AB10000</tracking_id>
    </tracking_event>
    </tracking_events>
STR;
4

4 回答 4

1

我建议使用 XSL 样式表来转换文档:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

<xsl:template match="*"> 
  <xsl:choose>
    <xsl:when test="contains(name(), '-')">
      <xsl:element name="{translate(name(),'-','_')}">
      <xsl:copy-of select="@*"/>
          <xsl:apply-templates/>
      </xsl:element>
    </xsl:when>
    <xsl:otherwise>
      <xsl:copy>
          <xsl:copy-of select="@*"/>
          <xsl:apply-templates/>
      </xsl:copy>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

</xsl:stylesheet>

样式表将创建一个具有固定 nodeName 的新元素,并将属性和 childNodes 复制到该节点上,仅此而已。

演示:http ://www.xsltcake.com/slices/5Wuq6P

于 2012-11-22T17:05:46.553 回答
0

您是否尝试过使用正则表达式?就像是

$response['body'] = preg_replace('(<[^>]*)[a-zA-Z]\-[a-zA-Z]([^>]*)', '$1_$2', $response['body']);

没有测试以上,但我认为它应该工作。

于 2012-11-22T16:34:32.440 回答
0

这循环通过 XML 表示。恐怕任何属性都会丢失(如果需要,应该很容易调整函数以保留它们)。这是一个通用功能,不会被文本内容绊倒。

<?php

header('Content-Type: text/plain');


$response['body'] = <<<STR
<?xml version="1.0"?>
    <tracking-events>
    <tracking-event>
    <type>DELIVERED</type>
    <time>2012-12-04T11:45:08.554+0200</time>
    <tracking-id>AB10000</tracking-id>
    </tracking-event>
    </tracking-events>
STR;

$existing = new SimpleXMLElement($response['body']);
$name = $existing->getName();
$name = str_replace('-', '_', $name);
$new = new SimpleXMLElement('<' . $name . '/>');

add_corrected_nodes($existing, $new);

function add_corrected_nodes(&$from, &$to) {
    foreach ($from as $k => $v) {
        $new = str_replace('-', '_', $k);
        $child = $to->addChild($new);
        if ($from->$k->children()) {
            add_corrected_nodes($from->$k->children(), $child);
        } else {
            $to->$new = $v;
        }
    }
}

print_r($new->asXML());
于 2012-11-22T20:16:44.410 回答
0

经过测试,它有效!:D

 $xml=preg_replace('/<([^>]*?)-([^>]*?)>/', '<$1_$2>',$xml);
于 2012-11-22T16:41:29.860 回答