Php 删除标记内XML中的减号

Php 删除标记内XML中的减号,php,Php,我正在尝试仅在标记之间使用preg_replace来替换-to u POST请求的标头响应中正常接收的测试字符串 $response['body'] = <<<STR <?xml version="1.0"?> <tracking-events> <tracking-event> <type>DELIVERED</type> <time&

我正在尝试仅在标记之间使用preg_replace来替换-to u

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']=您尝试过使用正则表达式吗?差不多

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

$response['body']=preg\u replace('(]*)[a-zA-Z]\-[a-zA-Z]([^>]*),'$1\u$2',$response['body']);

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

您尝试过使用正则表达式吗?差不多

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

$response['body']=preg\u replace('(]*)[a-zA-Z]\-[a-zA-Z]([^>]*),'$1\u$2',$response['body']);

没有测试上述内容,但我认为它应该有效。

经过测试,它有效了!:D

 $xml=preg_replace('/<([^>]*?)-([^>]*?)>/', '<$1_$2>',$xml);
$xml=preg_replace('/]*?)-([^>]*?)>/','''$xml);

测试成功了!:D

 $xml=preg_replace('/<([^>]*?)-([^>]*?)>/', '<$1_$2>',$xml);
$xml=preg_replace('/]*?)-([^>]*?)>/','''$xml);

我建议使用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>

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


演示:

我建议使用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>

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


演示:

这个循环遍历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-12-04T11:45:08.554+0200
AB10000
STR;
$existing=newsimplexmlement($response['body']);
$name=$existing->getName();
$name=str_replace('-','',$name);
$new=新的SimpleXMLElement(“”);
添加节点($existing,$new);
函数添加节点(&$from,&$to){
foreach($k=>v){
$new=str_replace('-','',$k);
$child=$to->addChild($new);
如果($from->$k->children()){
添加节点($from->$k->children(),$child);
}否则{
$to->$new=$v;
}
}
}
打印($new->asXML());

这将遍历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-12-04T11:45:08.554+0200
AB10000
STR;
$existing=newsimplexmlement($response['body']);
$name=$existing->getName();
$name=str_replace('-','',$name);
$new=新的SimpleXMLElement(“”);
添加节点($existing,$new);
函数添加节点(&$from,&$to){
foreach($k=>v){
$new=str_replace('-','',$k);
$child=$to->addChild($new);
如果($from->$k->children()){
添加节点($from->$k->children(),$child);
}否则{
$to->$new=$v;
}
}
}
打印($new->asXML());

1个错误:在html/xml上使用正则表达式。第二个错误:不使用DOM。第三个错误:不实际提问您想更改任意XML字符串上的节点名称还是只更改显示的格式?XML是一种响应。以这种格式。我使用SimpleXMLElement提取子元素和值作为StringFirst错误:在html/xml上使用正则表达式。第二个错误:不使用DOM。第三个错误:不实际提问您想更改任意XML字符串上的节点名称还是只更改显示的格式?XML是一种响应。以这种格式。我使用SimpleXMLElement来提取子元素和值,因为如果任何XML节点包含任意文本,Strings都可能是危险的。如果
-
不在
[]
之间,则不需要转义
[^>]
也包括
[a-zA-Z]
$response['body']=preg\u replace(“/(]*)\-([^>]*)/I',“$1\$2',$response['body'];可以工作,但是如果提到UFT-8,那么如果任何XML节点包含任意文本,那么将其拧紧可能是危险的。
-
如果不在
[]
之间,则不需要转义,
[^>]
还包括
[a-zA-Z]
$response['body']=preg\u replace('/([^>]*)\-([^>]*)/i',“$1$2',$response['body');有效,但如果提到UFT-8,它会起作用,但如果设置了case,UFT_8就是结果:($response['body']=preg_replace('/(?]*?)-/','$1',$response['body']),做这个小动作,但如果设置了case,UFT_8就是结果:($response['body']=preg_replace('/('/((?]*?)-/),'1',$response['body']);做这个小动作