我试图从下面的假设HTML文件中提取名称结果。
<ul class="cat">
<li>sport</li>
<li>movie</li>
</ul>
<ul class="person-list">
<li>name 1</li>
<li>name 2</li>
<li>name 3</li>
<li>name 4</li>
<li>name 5</li>
<li>name 6</li>
</ul>
理想情况下,结果应该采用如下所示的数组格式: 阵列( 名字1, 名字2, 名称3,.......... )
好的我可以通过2个正则表达式匹配轻松完成此操作,但我想知道我是否可以只使用一个。
答案 0 :(得分:0)
使用像DOMDocument这样的HTML解析器,这会更容易,更强大。正则表达式是解析HTML的糟糕工具,因为HTML不是regular language。尝试类似:
$html = <<<END
<ul class="cat">
<li>sport</li>
<li>movie</li>
</ul>
<ul class="person-list">
<li>name 1</li>
<li>name 2</li>
<li>name 3</li>
<li>name 4</li>
<li>name 5</li>
<li>name 6</li>
</ul>
END;
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXpath($dom);
$items = $xpath->query("//li[starts-with(.,'name ')]/text()");
foreach ($items as $item) {
echo $item->wholeText . "\n";
}
输出:
name 1
name 2
name 3
name 4
name 5
name 6
答案 1 :(得分:0)
$pattern = '/<ul class=\"person\-list\">\s*(<li>(.*?)<\/li>)*\s*<\/ul>/ms';
preg_match_all($pattern, $TXT, $array);
echo '<pre>', print_r($array, true), '</pre>';
答案 2 :(得分:0)
以下是执行此操作的示例perl脚本。假设你的html在my.html中
open FILE, "<", "my.html" or die $!;
my @arr;
while (my $line = <FILE>) {
if ($line =~ /<li>\s*(name[^>]+)<\/li>/) {
push(@arr, $1);
}
}
print "Array (@arr)\n";
解释 - 将html文件的每一行读入$ line,然后我们使用正则表达式
/<li>\s*(name[^>]+)<\/li>/
查看当前行是否符合我们想要的内容(即字符串'名称后跟一些字符'包含在li标签内)。同时,“名称后跟一些字符”子字符串被捕获到反向引用中。如果我们找到匹配项,则捕获的字符串将附加到数组中。