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