0

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

<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>

4

1 回答 1

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);
于 2013-03-01T21:04:24.113 回答