使用XPath解析文档

时间:2013-03-01 20:21:13

标签: php parsing markup

我需要解析一个我以前从未见过的结构的文档。它看起来像这样:

<cat:707>
<begad:00216057>
<zip:48650>
<addr:2100 N. HURON RD, PINCONNING, MI USA>
COUNTRY 10 Mi. N. of Midland, 3 bedroom, 2 baths, appliances furnished, 300x500 finished pole barn on 5 acres,  $750/mo. + utilities, 989-965-1118.
<endad>


<cat:710>
<begad:00216094>
<zip:48640>
<addr:1100 S HOMER RD, MIDLAND, MI USA>
IMMEDIATE Occupancy, extra clean, small 2 bedroom by nature center. Pet maybe/extra $400 deposit/references 839-4552
<endad>

我如何在php中解析这样的内容以获取冒号后的信息(即:707中的cat}和<endad>之前的文本?

1 个答案:

答案 0 :(得分:1)

这看起来像某人组成的东西,但你可以很容易地弄明白。

这里有一些似乎有用的Python。如果需要,您可以从此处转换为XML并使用XPath进行解析。

import re

parse_re = (r"""
<(?P<key>\w+):(?P<value>[^>]+)>  # <key:value>
| (?<=>)\s*(?P<description>.*?)\s+<endad> #description
""", re.VERBOSE)

adparser = re.compile(*parse_re)

def getrecords(input):
    record = {}
    for match in adparser.finditer(input):
        if match.group('key'):
            record[match.group('key')] = match.group('value')
        elif match.group('description'):
            record['description'] = match.group('description')
            yield record
            record = {}

print list(getrecords(input))

我看到您更新了您的问题以指定您使用PHP。同样的正则表达式似乎也适用于pcre_*

$parse_re = '/
<(?P<key>\w+):(?P<value>[^>]+)>  # <key:value>
| (?<=>)\s*(?P<description>.*?)\s+<endad> #description
/x';

preg_match_all($parse_re, $input, $matches, PREG_SET_ORDER);

var_export($matches);