PHP Preg_match_all在多行上的XML / GML输出上

时间:2016-01-19 08:52:56

标签: php xml preg-match preg-match-all

我尝试使用来自WFS服务的preg_match_all()来匹配多行XML / GML输出。我收到一堆公共服务器上可用的数据供所有人使用。我尝试使用 s和m flag ,但运气不佳。 我收到的数据看起来像这样:

<zwr:resultaat>
  <zwr:objectBeginTijd>2012-09-18</zwr:objectBeginTijd>
  <zwr:resultaatHistorie>
    <zwr:datumInvoeren>2012-10-31</zwr:datumInvoeren>
    <zwr:invoerder>
      <zwr:voornaam>Joep</zwr:voornaam>
      <zwr:achternaam>Koning, de</zwr:achternaam>
      <zwr:email>jdekoning@hhdelfland.nl</zwr:email>
      <zwr:telefoon>015-2608166</zwr:telefoon>
      <zwr:organisatie>
        <zwr:bedrijfsnaam>Hoogheemraadschap van Delfland</zwr:bedrijfsnaam>
        <zwr:adres>
          <zwr:huisnummer>32</zwr:huisnummer>
          <zwr:postcode>2611AL</zwr:postcode>
          <zwr:straat>Phoenixstraat</zwr:straat>
          <zwr:woonplaats>DELFT</zwr:woonplaats>
        </zwr:adres>
        <zwr:email>info@hhdelfland.nl</zwr:email>
        <zwr:telefoon>(015) 260 81 08</zwr:telefoon>
        <zwr:website>http://www.hhdelfland.nl/</zwr:website>
      </zwr:organisatie>
    </zwr:invoerder>
  </zwr:resultaatHistorie>
  <zwr:risicoNiveau>false</zwr:risicoNiveau>
  <zwr:numeriekeWaarde>0.02</zwr:numeriekeWaarde>
  <zwr:eenheid>kubieke millimeter per liter</zwr:eenheid>
  <zwr:hoedanigheid>niet van toepassing</zwr:hoedanigheid>
  <zwr:kwaliteitsOordeel>Normale waarde</zwr:kwaliteitsOordeel>
  <zwr:parameterGrootheid>
    <zwr:grootheid>Biovolume per volume eenheid</zwr:grootheid>
    <zwr:object>Microcystis</zwr:object>
  </zwr:parameterGrootheid>
  <zwr:analyseProces>
    <zwr:analyserendeInstantie>AQUON</zwr:analyserendeInstantie>
  </zwr:analyseProces>
</zwr:resultaat>

还可以在以下位置找到数据示例: http://212.159.219.98/zwr-ogc/services?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetGmlObject&OUTPUTFORMAT=text%2Fxml%3B+subtype%3Dgml%2F3.1.1&TRAVERSEXLINKDEPTH=0&GMLOBJECTID=ZWR_MONSTERPUNT_304427

一切都是荷兰语,但这对问题的背景无关紧要。这种情况是我想搜索此代码的多行并获取标记之间的值。我也尝试单独阅读(效果很好),但因为有多种标签组合(有时会使用或不使用标签),这会混合我收到的数据,并且在获取的数据中没有结构数据

我认为阅读一整套标签是个好主意,这样我就可以将数据保存在一起。我当前的 preg_match_all()代码是:

preg_match_all("/<zwr:risicoNiveau>(.*)<\/zwr:risicoNiveau><zwr:numeriekeWaarde>(.*)<\/zwr:numeriekeWaarde><zwr:eenheid>(.*)<\/zwr:eenheid><zwr:hoedanigheid>(.*)<\/zwr:hoedanigheid>
    <zwr:kwaliteitsOordeel>(.*)<\/zwr:kwaliteitsOordeel><zwr:parameterGrootheid><zwr:object>(.*)<\/zwr:object><zwr:grootheid>(.*)<\/zwr:grootheid><\/zwr:parameterGrootheid>/m", $content, $stof);

因为你可以看到我想从一个preg_match_all()读取多个值,这将给我一个包含多个数组的数组。

如何在彼此之后读取多个标签(在不同的行上?)?当我使用 var_dump()来显示所有数据时,它会向我显示一个没有数据的多维数组。 s和m标志对我不起作用?难道我做错了什么?欢迎使用PHP中的其他方法!

1 个答案:

答案 0 :(得分:1)

1。)您需要在代码之间添加whitespace \s <\/zwr:risicoNiveau> \s* <zwr:numeriekeWaarde> ...

2.。)进一步使用捕获组内的.*?来匹配非greedy <zwr:risicoNiveau>(.*?)<\/zwr:risicoNiveau>

3.。)使用x flag(自由间距模式)提高正则表达式的可读性。
Regex demo at regex101

注意:使用exclusion ([^<]*?)而不是(.*?)来强制格式like this。要匹配其余标记,请在可选标记quantifier上使用可选like this ?,并选择<zwr:object>

$pattern = '~
<zwr:risicoNiveau>(.*?)</zwr:risicoNiveau>\s*
<zwr:numeriekeWaarde>(.*?)</zwr:numeriekeWaarde>\s*
<zwr:eenheid>(.*?)</zwr:eenheid>\s*
<zwr:hoedanigheid>(.*?)</zwr:hoedanigheid>\s*
<zwr:kwaliteitsOordeel>(.*?)</zwr:kwaliteitsOordeel>\s*
<zwr:parameterGrootheid>\s*
  <zwr:grootheid>(.*?)</zwr:grootheid>\s*
  <zwr:object>(.*?)</zwr:object>\s*
</zwr:parameterGrootheid>
~sx';
  

PREG_SET_ORDER 对结果进行排序,以便$matches[0]是第一组匹配的数组,$matches[1]是第二组匹配的数组,依此类推...... < SUP> read more in the PHP MANUAL

if(preg_match_all($pattern, $str, $out, PREG_SET_ORDER) > 0)
  print_r($out);

See php demo at eval.in