0

我完全坚持如何解决这个问题。基本上我有一个 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 部分。我没有尝试过任何事情,因为我什至不知道从哪里开始,请有人帮助我。

4

3 回答 3

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 文档,并且能够处理诸如标签名称与文档元素匹配的元素和自闭合标签之类的陷阱。

看到它工作

于 2013-04-10T01:21:32.023 回答
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));
于 2013-04-10T00:00:21.540 回答
0

您应该能够使用正则表达式来检测 XML 标头 ( <?xml version="1.0"?>) 和根元素 ( <data>)。一旦你有了它,你只需要检测结束标签 ( </data>) 就可以了!小麦与谷壳分离!

于 2013-04-09T23:42:22.177 回答