如何在一个preg_match中取名

时间:2010-04-16 08:15:30

标签: php regex

我试图从下面的假设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个正则表达式匹配轻松完成此操作,但我想知道我是否可以只使用一个。

3 个答案:

答案 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标签内)。同时,“名称后跟一些字符”子字符串被捕获到反向引用中。如果我们找到匹配项,则捕获的字符串将附加到数组中。