Главная > Практика

Считаем количество изображений на сайте

30 января 2010 | Просмотров: 119

Итак, начинаем! Постоянные посетители моего сайта, наверно, уже заметили что последние два дня я посвятил двум очень важным постам о регулярных выражениях – это была статья о синтаксисе регулярных выражений и о функциях, имеющихся в арсенале языка PHP для работы с ними.

Сегодня хотел бы прейти от сухой, но очень важной, справочной информации к живому практическому примеру использования этих самых регулярных выражений.

Итак, напомню, что регулярные выражения (от англ. «regular expressions» или сокращенно RegExp, RegEx, или как их называют в народе - регэкспы или регексы) представляют собой специализированный мини-язык, предназначенный для поиска в строках по шаблону.

Поставим себе простенькую задачу на сегодня: подсчитать, используя регулярные выражения, количество изображений на каком либо сайте, например на сайте - www.astronomynow.com.

Самое сложное здесь – составить само регулярное выражение. Но для начала давайте вспомним, как в коде HTML оформляются изображения. И вот первый попавшийся пример с того же сайта-счастливчика)):

<img src="/images/grafix/spacer.gif" alt="" width="140" height="3">

Пусть этот шаблон повисит у нас перед глазами, а мы пока займемся составлением самого регулярного выражения для поиска в HTML-коде этого шаблона. Начнем с простого. Любое регулярное выражение должно быть заключено в так называемые граничные символы. Вариантов граничных символов несколько:

//

##

||

@@

До недавнего времени я пользовался только этим - //, просто потому что не знал о существовании остальных)), а как узнал, мне сразу приглянулся вариант граничных символов с использованием диеза (или решетки) - ##.

Итак, начало положено, наше регулярное выражение будет заключено в граничные символы диеза ##. Вооружившись нашими знаниями о том что любое изображение в HTML коде страницы начинается с комбинации <img src=" мы так и запишем в регулярное выражение:

#<img src="#

Все хорошо! Такое регулярное выражение уже можно использовать! Но! Допустим если после <img в HTML-коде страницы будет идти не один, а два, а то и больше символов пробела (что вполне допустимо), то такой вариант уже не будет соответствовать нашему регулярному выражению и будет пропущен(((. Чтобы такого казуса не произошло запишем наше выражение, добавив в него специальный символ:

#<img\s+src="#

В статье о синтаксисе регулярных выражений можете прочитать, что специальный символ \s соответствует любому пробельному символу, а символ + (квантификатор) после него указывает, что этот пробельный символ может встречаться один и более раз подряд.

Также легко понять что между символом = в записи src= могут встречаться пробелы, причем в этом случае пробелов может быть как больше одного, так может и не быть вовсе. Учтем и этот момент расставив по обе стороны символа = специальный символ \s, но на этот раз после него следует поставить *, указывая на то, что пробелов может быть от 0 до «ОЧЕНЬ МНОГА». И наше регулярное выражение будет уже иметь следующий вид:

#<img\s+src\s*=\s*"#

Осталось разобраться только с последней кавычкой)). Это та самая кавычка, после которой начинается адрес к изображению. Знающие люди смело скажут вам, что этот адрес может быть заключен в двойные кавычки (как в нашем случае), одинарные кавычки (') или кавычек может вовсе не быть. Используя синтаксис регулярных выражений такой момент можно описать метасимволом ["'] – такая запись соответствует одному символу, из тех, что перечислены в квадратных скобках. Указать на то, что кавычка (будь то двойная или одинарная) может быть только одна, или ее может вообще не быть нам поможет квантификатор ?, который следует поставить сразу за квадратными скобками. И вот что мы получаем в итоге:

#<img\s+src\s*=\s*["']?#

И последний момент, который стоит учесть – это то что HTML код может быть набран как большими так и малыми буквами:

<img src="/images/grafix/spacer.gif" alt="" width="140" height="3">

<IMG SRC="/images/grafix/spacer.gif" ALT="" WIDTH="140" HEIGHT="3">

Исключить влияние регистра можно, воспользовавшись модификатором i, который следует поставить сразу после закрывающего граничного символа:

#<img\s+src\s*=\s*["']?#i

Дело осталось за малым – написать простой PHP код, который будет получать HTML код страницы и осуществлять поиск изображений, по только что сочиненному регулярному выражению.

Для начала занесем адрес сайта в переменную $url:

$url="http://www.astronomynow.com";

Получить содержимое сайта нам поможет функция file_get_contents() которая принимает в качестве аргумента адрес сайта и возвращает все его содержимое, которое мы умело заносим в переменную $content:

$content = file_get_contents($url);

Для поиска в содержимом сайта по регулярному выражению воспользуемся функцией preg_match_all() которая как раз и возвращает количество найденных совпадений:

$count = preg_match_all('#<img\s+src\s*=\s*["']?#i', $content, $matches);

Первым параметром функция preg_match_all() принимает наше регулярное выражение заключенное в одинарные кавычки! Но мы же помним что в самом тексте регулярного выражения мы использовали одинарную кавычку!! Это приведет к тому что программа, обрабатывающая функцию не сможет правильно определить где начало, а где конец регулярного выражения и выдаст ошибку((. Чтобы этого не произошло, все одинарные кавычки в регулярном выражении должны быть экранированы обратным слэшем(\), указывая на то, что мы имеем в виду именно символ ОДИНАРНОЙ КАВЫЧКИ, а никак не границу регулярного выражения:

$count = preg_match_all('#<img\s+src\s*=\s*["\']?#i', $content, $matches);

Вторым параметром функция preg_match_all() принимает текст в котором необходимо искать совпадения. В нашем случае этот текст содержится в переменной $content.

Ну и третий параметр ($matches) – это переменная, в которой будут храниться все найденные совпадения. В данном примере мы этой переменной пользоваться не будем.

В итоге мы получим, что переменная $count будет содержать число найденных совпадений, или, проще говоря, количество изображений, находящихся на сайте www.astronomynow.com. Осталось только вывести это значение на экран с помощью конструкции echo $count;

Итоговый PHP код:

<? 
$url
="http://www.astronomynow.com";
$content=file_get_contents($url);

$count=preg_match_all('#<img\s+src\s*=\s*["\']?#i'$content$matches);

echo 
$count;
?>

Вот так, на первый взгляд сложная задача решается всего 4-мя строчками кода;).

Приглашаю всех обсудить эту статью на форуме.

Чтобы оставить коментарий Вы должны зарегистрироваться, или войти, если Вы уже зарегистрированы

Комментариев (0)