Регулярное выражение скребка - PullRequest
0 голосов
/ 06 апреля 2011

Я действительно ДЕЙСТВИТЕЛЬНО плох в регулярных выражениях. Это просто еще не щелкнуло. Я пытаюсь сделать небольшое приложение, которое извлекает все теги изображений из их атрибутов 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 (): неизвестный модификатор '>' в C: \ Apache2.2 \ htdocs \ it302 \ regex \ regex.php в строке 17 соответствует:

Я не уверен, где я ошибся в своем регулярном выражении. Я перепробовал несколько вещей, но все так же запутался.

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 06 апреля 2011

В вашем регулярном выражении последний .*/> неверен.

нет / там ...

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

или \/? побег и сделать его необязательным ...

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

но это регулярное выражение работает только в том случае, если высота ширины src находится в данном заданном порядке в теге img, а ширина и высота также допускают указанные значения и единицы измерения. например width = "0.9em" является верным html ...
это все причины, почему вы не должны использовать regex для разбора html (и многих других ...)

1 голос
/ 06 апреля 2011

Не используйте регулярные выражения для этого. Особенно, если ты ДЕЙСТВИТЕЛЬНО плох: :)

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 />"
        );
   }
...