图像标签刮刀正则表达式

时间:2011-04-06 03:35:44

标签: regex preg-match-all

我对正则表达式真的很不好。它还没有点击。我正在尝试制作一个小应用程序来提取其src,width和height属性的所有图像标记。这就是我到目前为止所做的:

<?php

function print_links ($url) 
{
    $fp = fopen($url, "r") or die("Could not contact $url");
    $page_contents = "";
    while ($new_text = fread($fp, 100)) {
        $page_contents .= $new_text;
    }


    $match_result = 
    preg_match_all( '/<img.*src=[\"\'](.*)[\"\'].*width=(\d+).*height=(\d+).*/>/i',
                $page_contents,
                $match_array, 
                PREG_SET_ORDER);

  echo "number matched is: $match_result<br><br> ";

  print_r($match_array);

  foreach ($match_array as $entry) {
   $tag = $entry[0];
   $src = $entry[1];
   $width = $entry[2];
   $height = $entry[3];
   print  (" <b>src</b>: $src; 
        <b>width</b>:  $width<br />
        <b>height</b>:  $height<br />
        <b>tag</b>:  $tag<br />"
        );
    }

}

print_links ("http://www.drudgereport.com/");

?>

但我得到了这个小错误:

警告:preg_match_all():未知修饰符'&gt;'在第17行匹配的C:\ Apache2.2 \ htdocs \ it302 \ regex \ regex.php中:

我不确定我的正则表达式出错了。我尝试了很多东西,但最终却感到很困惑。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

在你的正则表达式中,最后一个.*/>是错误的。

没有/那里......

/<img.*src=[\"\'](.*)[\"\'].*width=(\d+).*height=(\d+).*>/i

\/?转义并将其设为可选...

/<img.*src=[\"\'](.*)[\"\'].*width=(\d+).*height=(\d+).*\/?>/i

但是这个正则表达式只有在src宽度高度在img标签内的给定顺序时才有效,宽度和高度也允许引用的值和单位。例如width =“0.9em”是有效的html ...
这就是为什么你不应该使用正则表达式来解析html(还有更多......)

答案 1 :(得分:1)

不要使用正则表达式。特别是如果你真的很糟糕:))

http://simplehtmldom.sourceforge.net/

foreach($html->find('img') as $element){
   $src = $element->src;
   $width = $element->width;
   $height = $element->height;
   print  (" <b>src</b>: $src; 
        <b>width</b>:  $width<br />
        <b>height</b>:  $height<br />
        <b>tag</b>:  $tag<br />"
        );
   }