例子如下:
<element abc="123" def="456" ghi="789"/>
有一个如上的字符串,其中abc
、def
、ghi
的位置有可能并非按照这个顺序排列的(例如<element abc="123" ghi="789" def="456"/>
),也有可能缺少部分属性(如<element ghi="789" def="456"/>
),请问能否实现无论这几个属性如何排列,都能够将他们的值(指的是123、456、789)提取出来?
Why it's not possible to use regex to parse HTML/XML: a formal explanation in layman's terms: @StackOverflow
楼上的都不是无序匹配 差评
Python
s = '<element def="8972" abc="dsfasdfasfdasf"/>' re.findall(r'(abc|def|ghi)="(.*?)"', s) # [('def', '8972'), ('abc', 'dsfasdfasfdasf')]
这里献上一个笨方法:
sed 's/.*abc="\([0-9]*\).*/\1/g' filename sed 's/.*def="\([0-9]*\).*/\1/g' filename sed 's/.*ghi="\([0-9]*\).*/\1/g' filename
得到每个属性的值,然后整合起来。
我使用PHP来做吧,说说我的做法, 分3次做, 所以不会有问题:
<?php $string = '<element abc="123" def="456" ghi="789"/>'; preg_match("/abc=\"(\d+)\"/s", $string, $matches_abc); preg_match("/def=\"(\d+)\"/s", $string, $matches_def); preg_match("/ghi=\"(\d+)\"/s", $string, $matches_ghi); var_dump($matches_abc, $matches_def, $matches_ghi); ?>
这个只能解决问题, 非完美解答。
分割线请教朋友后得出完美解答,PHP版本:
<?php $txt = '<element def="123" abc="456" ghi="789"/>'; //$txt = '<element def="456" ghi="789"/>'; //#$txt = '<element/>'; $pattern = '/(?!<element)(?:([a-z\d]+?)=([\'"][^=]+?[\'"]))/'; preg_match_all($pattern, $txt, $matches); var_dump($matches); ?>