请指定正确的正则表达式

时间:2010-07-30 04:41:15

标签: php regex

我希望使用Php.Can检索<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#EBEBEB"></table>之间的数据。请指定正确的正则表达式,以便在给定的表格标签之间检索数据

3 个答案:

答案 0 :(得分:2)

我相信你需要的是XPath而不是正则表达式。

答案 1 :(得分:1)

这取决于你要检索的内容。我自己不是PHP专业人士,但是我会这样做:

<?php
    $contents = file_get_contents($_SERVER['PHP_SELF']);
    $array = explode("<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#EBEBEB\">", $contents);
    $newarray = explode("</table>", $array[1]);
    $yourdata = $newarray[0];
?>

如果您不介意在那里使用其他原始HTML,则应该使用此方法。否则,其他人可能会有更好的解决方案。

答案 2 :(得分:1)

虽然正则表达式可以适用于各种各样的任务,但我发现解析HTML DOM时通常会遇到这种情况。 HTML的问题在于,文档的结构变化很大,难以准确(并且准确地说,我的意思是100%的成功率,没有误报)提取标签。

我建议您使用DOM解析器,例如phpQuery,并将其用作以下内容:

function get_first_image($html){
    $dom = phpQuery::newDocument($html);

    $first_img = $dom->find('img:first');

    if($first_img !== null) {
        return $first_img->attr('src');
    }

    return null;
}

有些人可能认为这样做有点过分,但最终,维护起来会更容易,并且还可以提供更多的可扩展性。例如,使用DOM解析器,我也可以获得alt属性。

可以设计一个正则表达式来实现相同的目标但是会限制它会强制alt属性位于src之后或相反的​​目标,并克服此限制会增加正则表达式的复杂性。

另外,请考虑以下内容。要使用正则表达式正确匹配<img>标记并仅获取src属性(在第2组中捕获),您需要以下正则表达式:

<\s*?img\s+[^>]*?\s*src\s*=\s*(["'])((\\?+.)*?)\1[^>]*?>

然后,如果出现以上情况,则上述情况可能会失败:

  • 属性或标记名称为大写,并且不使用 i 修饰符。
  • src属性周围没有使用引号。
  • 然后src的另一个属性在其值的某处使用>字符。
  • 我没有预料到的其他一些原因。

所以再一次,不要使用正则表达式来解析dom文档。