我有这种HTML结构:
<p>TEST</p><ul><li>1 abc</li><li>2 def</li><li>3 ghi</li></ul>
我希望得到这个:
- Group 1 : TEST
- Group 2 : 1 abc
- Group 3 : 2 def
- Group 4 : 3 ghi
所以我写了这个reg exp:
<p>(.*?)<\/p>.*?<ul>(?(1)<li>(.*?)<\/li>*)<\/ul>
结果是:
Match 1
Full match 0-50 `<p>TEST</p><ul><li>1</li><li>2</li><li>3</li></ul>`
Group 1. 3-7 `TEST`
Group 2. 19-40 `1</li><li>2</li><li>3`
Cf Regex101:https://regex101.com/r/eoHtuI/1
这是用PHP格式编写的,但我也可以将它与Javascript一起使用。 有什么想法吗?
答案 0 :(得分:0)
您可以拆分每个标签序列(无论如何为您的样本输入)。
代码:(Demo)
$html=<<<HTML
<p>TEST</p><ul><li>1</li><li>2</li><li>3</li></ul>
HTML;
var_export(preg_split('~(?:<[^>]+>)+~',$html,NULL,PREG_SPLIT_NO_EMPTY));
输出:
array (
0 => 'TEST',
1 => '1',
2 => '2',
3 => '3',
)
*注意,不建议使用正则表达式解析html。这是一个DomDocument / Xpath方法(主要来自https://stackoverflow.com/a/25695410/2943403)
代码:(Demo)
$dom=new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
foreach ($xpath->evaluate('//*[count(*) = 0]') as $node) {
$result[]=$node->nodeValue;
}
var_export($result); // same output as my regex method