preg_replace表现不如预期?

时间:2015-03-23 11:54:30

标签: php regex xml-parsing preg-replace

偷看。我在这里遇到了一个问题。我收到这些数据,只想剥离<SOAP-ENV元素及其各自的结束元素。

这是标题和正文开始部分。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
  <SOAP-ENV:Header></SOAP-ENV:Header>
  <SOAP-ENV:Body>
    <VisionDataExchange>

现在我对$xml包含整个xml数据的变量进行常规尝试:

$xml = preg_replace("/<\\/?SOAP(.|\\s)*?>/",'',$xml);

现在我的结果就是这个。它实际上剥离了openening标签,但没有关闭标签?我在这里缺少什么?

<?xml version="1.0" encoding="UTF-8"?>

  </SOAP-ENV:Header>

    <VisionDataExchange>

2 个答案:

答案 0 :(得分:0)

我建议只匹配标记内的所有内容,而不是any character or whitespace。看看this regex

$re = "/<\\/?SOAP[^<>]+?>/"; 
$str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\">\n  <SOAP-ENV:Header></SOAP-ENV:Header>\n  <SOAP-ENV:Body>\n    <VisionDataExchange>"; 
$subst = ""; 

$result = preg_replace($re, $subst, $str);

答案 1 :(得分:0)

好的,所以在我的桌子上几乎打破了我的头骨之后,我发现了问题所在。正则表达式确实工作得很好!字符串中有一个隐藏的\导致正则表达式失败。