我完全坚持如何处理这个问题。基本上我有一个curl调用,返回一个xml以及其他信息,我需要做的是基本上只获取返回数据的xml部分,并将其设置为一个单独的变量我猜。例如,
array(
['name']='john',
['location']='california',
)
<?xml version="1.0"?>
<data>
<name>somename</name>
</data>
array(
['name']='john',
['location']='california',
)
array(
['name']='john',
['location']='california',
)
所以我只想要整个数据的XML部分。我没有尝试任何东西,因为我甚至不知道从哪里开始,有人可以帮助我。
答案 0 :(得分:4)
作为前奏,重要的是要注意无论你做什么,这几乎肯定是错误的方法。您应该尝试操作生成此数据的应用程序,以便以严格定义的格式生成数据。
就本答案而言,我认为在这种情况下是不可能的。
很明显,答案是使用正则表达式从其余数据中提取XML。
但是,尝试提供此正则表达式的其他答案对于通用用例来说都不够好。这就是我要做的事情:
@
(?:<\?xml.*?\?>\s*)? # optionally match the XML declaration
<([^/]\S*)[^>]*> # match opening tag and capture the tag name
(?: # group alternates together
(?> # atomic group for efficiency
(?:(?!</?[^/>]+[^/]>).)+ # match everything up to the next long tag
)
| (?R) # ...or a recursive match of the expression
)* # ...zero or more times
</\1> # match the closing tag
@isx
这一点至关重要,假设您正在寻找的XML格式正确。重要的是要注意,除非您100%确定要搜索的XML格式正确,否则您不应该,并且在很大程度上可以不使用正则表达式。
如果是这种情况,此表达式将匹配嵌套在给定字符串中的任何完整XML文档,并且能够处理陷阱,例如标记名称与文档元素和自闭标记匹配的元素。
答案 1 :(得分:1)
试试这个:
$result = "
array(
['name']='john',
['location']='california',
)
<?xml version=\"1.0\"?>
<data>
<name>somename</name>
</data>
array(
['name']='john',
['location']='california',
)
array(
['name']='john',
['location']='california',
)
";
$matches = array();
preg_match('/<\?xml(.*)<\/data>/is', $result, $matches);
var_dump(reset($matches));
答案 2 :(得分:0)
您应该能够使用正则表达式来检测XML标头(<?xml version="1.0"?>
)和根元素(<data>
)。一旦你有了,你只需要检测结束标记(</data>
)并瞧!小麦与谷壳分开!