Регулярное выражение скребка
Я действительно ДЕЙСТВИТЕЛЬНО плох в регулярных выражениях. Это просто еще не щелкнуло. Я пытаюсь сделать небольшое приложение, которое извлекает все теги изображений из их атрибутов 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 ответа
В вашем регулярном выражении последнее .*/>
неправильно.
нет /
там...
/<img.*src=[\"\'](.*)[\"\'].*width=(\d+).*height=(\d+).*>/i
или же \/?
бежать и сделать это необязательно...
/<img.*src=[\"\'](.*)[\"\'].*width=(\d+).*height=(\d+).*\/?>/i
но это регулярное выражение работает только в том случае, если высота ширины src находится в указанном порядке в теге img, а ширина и высота также допускают указанные значения и единицы измерения. Например, ширина = "0,9em" является действительным HTML...
Это все причины, почему вы не должны использовать регулярные выражения для анализа HTML (и многое другое...)
Не используйте регулярные выражения для этого. Особенно, если ты ДЕЙСТВИТЕЛЬНО плохой:)
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 />"
);
}