我需要解析一个我以前从未见过的结构的文档。它看起来像这样:
<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>
之前的文本?
答案 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);