Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

PHP, SQL, SSI-Дневник ламера, превращающегося в ГУРУ :-) Команда CHMOD Регулярные выражения в PHP


Информационный Канал Subscribe.Ru

Выпуск номер 9
Рассылка: Дневник ламера.
     
 

Забавный анекдот нашёл :-)

Два "новых русских" сидят за компом. У одного в руках многозарядная винтовка,
у другого - копошится живая мышка. Оба молча смотрят на черный экран монитора.
Наконец тот, у которого мышка, достает мобильник и звонит:
- Але! Ну че, че-то опять не работает... Да уже и винчестер купили и мышку...а
он опять не работает.

Сегодня расскажу вкратце про команду CHMOD и кусок скрипта, который выдирает статистику с рамблера - определяет, сколько страниц сайта им проиндексировано.

Команда CHMOD выставляет доступы на файлы и папки сервера.
Разделение прав ведётся для Владельца(owner), Группы(group) и всех остальных(publick).
Как я понял, для каждого из них выделяется три бита на разрешения. Х Х Х
Значения Owner (Владелец) Group (Группа) Public (Остальные)
Read = 4 X X X
Write = 2 X    
Execute = 1 X X X
Сумма: (4 + 2 + 1) = 7 (4 + 1) = 5 (4 + 1) = 5

Первый бит(чтение) - 4, второй(запись) - 2, третий(запуск) - 1. Серверу передаётся в виде:
chmod X1X2X3 - соответственно Х1 - владельцу, Х2 - группе, Х3 - всем остальным.
Тут элементарно, хотим дать только чтение какой-то группе, пишем 4+0+0 = 4, хотим чтение-запись, пишем 4+2+0=6. Хотим всё сразу 4+2+1=7 и передаём уже трёхзначное число, где каждому пользователю своё число chmod 755 тоесть все могут делать что хотят с файлом.

$host='ftp.edu-rus.org';
$login='так я вам и сказал :-)';
$password='даже не надейтесь :-)';
$connect=ftp_connect($host, 21, 60);
$result=ftp_login($connect, $login, $password);
$command="chmod 0766 /www/admin/selectlang.htm"; // пихаем в переменную string саму команду, параметры доступа и имя файла, на которое выставляем разрешение.
ftp_site($connect, $command); // Отправляем команду на сервер
ftp_quit($connect);


Это я писал в прошлом выпуске, а здесь только как повторение в тему.
Вот и всё, что я хотел сказать про CHMOD. Общий принцип надеюсь вам теперь понятен.

Далее скрипт статистики индексированных страниц сайта в рамблере.

// Определение формы и поля ввода для адреса сайта, который хотим проверить
<form name="form1" method="post" action="test6.php">
Введите название вашего хоста:<br>
(Не более 50 символов)
<br>
<br>
<input name="host" type="text" id="host" maxlength="50"> // Здесь забиваем имя хоста.
<input type="submit" name="Submit" value="Проверить"> // Кнопка отправки :-)
</form><br>
<?
if(isset($host)) // Если хост был введён, то запускаем отрезание того, что не нужно в адресе и выделение того, что нам нужно.
{
$host=substr($host,0,50); // Просто отрезаем адрес по длине, чтобы самые умные не делали переполнения. формат команды простой, сначала переменная, которую режем, потом стартовая позиция, в данном случае самое начало, тоесть 0 (ноль) и длина - сколько символов отрезаем из поступившей к нам переменной из формы.

$pattern="/(http\:\/\/)*([a-zA-Z\.\-_\d]*)(\?)?/i"; // Это регулярное выражение, в соответствии с которым будем обрабатывать строку. Оно заключается в косые слеши: / /
Регулярные выражения предназначены для того, чтобы искать в строках данные по заданным в них шаблонам. В данном случае я отрезаю внутреннбб часть, тоесть имя хоста, которое идёт после http:// и отрезаю всякие переменные, которые могут идти после знака (?) Выделяю только само имя сайта...
Далее в первых скобках идут группы символов. Содержимое скобок затем при обработке переменной пихается в массив, с размерностью, соответствующей количеству этих скобок.
В моём случае имя массива: $arr Нулевое значение массива $arr["0"] это полностью строка, совпадающая с регулярным выражением, первое значение массива $arr["1"] это кусок строки, совпадающий с паттерном из первых скобок, $arr["2"] совпадение со вторыми скобками и т.д.
Синтаксис достаточно сложный и по нему написано немало книг и талмудов всяких. В одном выпуске рассылки всё явно не перечислить. Не потому, что нельзя, а потому что мне лень :-)
Разве что вы заплатите за моё время ;-)
Так вот, в первых скобках я отрезаю кусок из адреса (http://) если он есть. Вы наверное заметили, что там слишком много слешей, которых нет в адресе, но они нужны для того, чтобы экранировать двоеточие, тоесть все символы, встречающиеся после слеша воспринимаются как СИМВОЛЫ, а так как есть СЛУЖЕБНЫЕ символы, которые совпадают с обычными, то это здорово помогает. Тоесть в данном примере я экранирую прямые слеши - обратными и двоеточие, чтобы они воспринимались именно как символы. Чтобы искать в строке прямой слеш, достаточно поставить их два \\ если надо найти в строке два слеша подряд, то пишем ЧЕТЫРЕ слеша \\\\ тоесть слеш "экранирует" только ОДИН символ после него. Знак *(звёздочка) после скобок говорит о том, что кусков строки вида http:// может быть один, или любое количество, а может и вообще не быть, если адрес вводиться без (http://).
Вместо * там могли стоять знак вопроса - ? он означает ноль или одно совпадение с данным куском паттерна, тоесть также, он может быть и только один, либо его может вообще не быть.
Знак + - плюс, означает один или несколько совпадений. Тоесть уже НЕ НОЛЬ и паттерн (его кусок) ОБЯЗАТЕЛЬНО должен находиться.
Также можно было задать количество в фигурных скобках X{8} Тоесть ровно восемь совпадений подряд с данным куском - буквой X ибо так: X{2,7} от двух до семи букв X подряд, либо X{2,} - две и больше букв X

Далее следующая скобка ([a-zA-Z\.\-_\d]*) в ней стоят квадратные скобки и перечисленное в них представляет из себя не группу символов, как в круглых, а ОДИН символ, тоесть в квадратных скобках перечисляются все символы, которые могут стоять в этом месте, или перечисляются те, которые Е могут стоять, в моём-же примере могут быть латинские буквы, как строчные, так и заглавные(они задаются в виде интервала с помощью знака (-) в данном случае минус является служебным символом), а также перечисляются другие символы, это точка и минус, но уже как символы, а не служебные символы.
Неэкранированный минус обозначает интервал, допустим [1-4] любое число от одного до четырёх.
Точка обозначает вообще любой символ.
Также со слешем есть несколько служебных символов:
\s - обозначает пробел. Можно записать и просто пробел пробелом, но тогда он не очень заметен. \S - всё, что НЕ пробел, можно записать так: [^\s] символ ^ это отрицание, тоесть НЕ пробел или что-то ещё. Если ^ стоит вначале последовательности, тоесть /^rest$/ то крышка ^ обозначает начало строки, а & конец строки. Именно СТРОКИ, а не части текста. Тоесть в первой позиции строки должна стоять буква (r) в последней (t).
\w - символьный класс [a-zA-Z_]
\W - всё, что НЕ \w можно записать так: [^a-zA-Z_]
\d - символьный класс цифр, тоесть [0-9]
\D - НЕ \d тоесть всё, что НЕ цифры.

preg_match($pattern, $host, $arr); // Ищет в строке $host совпадения с шаблоном, который у нас находится в переменной $pattern и пихает совпадения в массив $arr

$host=$arr[2]; // Выбираем из массива ту часть, которая нам нужна для последующего использования.
echo 'Хост: '.$host.'<br><br>';


// Строка рабочего примера. Тоесть адрес страницы на сервере, из которой мы будем выбирать статистику.
// http://search.rambler.ru/cgi-bin/rambler_search?filter=http%3A%2F%2findfilm.com.ru&limit=1&sort=1

// rambler.ru Строка адреса страницы, с которой мы будем выгребать статистику
$strsearch='http://search.rambler.ru/cgi-bin/rambler_search?filter=http%3A%2F%2F'.$host.'&limit=1&sort=1';
// ниже пример кода, который мы можем искать на странице
// >найдено&nbsp;документов:&nbsp;<b>425</b><br>

// Но будем искать этот :-))) Тут кодировка кои-8 не пугайтесь непонятных символов :-)
// <title>Rambler: '' (ДПЛХНЕОФПЧ: 425)</title>
$pattern="/(<title>)(Rambler:\s*\'\'\s*\()(ДПЛХНЕОФПЧ:\s*)(\d*)(\)<\/title>)/"; // Задаём паттерн поиска, условия я указывал выше, обратите внимание, что скобки в некоторых ckexfq['rhfybhe.ncz cktifvb? чтобы они не воспринимались как конец области, а именно как скобки.

if(!$fp=fopen($strsearch, "r")){echo 'Ошибка открытия Рамблера';} // Открываем ВЕБ страничку как файл и указываем атрибут "r" тоесть открываем для чтения.
while($str=fgets($fp)) // Гребём в цикле построчно данные со страницы с дескриптора открытого файла $fp пока данные не заканчиваются
{
preg_match($pattern, $str, $arr); if(isset($arr[4])){ $numr=$arr[4];} // Ищем совпадения с паттерном в строках и если совпадение найдено, то пихаем тот кусок, в котором есть количество индексированных страниц(тоесть цифра) в переменную $num
}
fclose($fp); Закрываем файл
if(isset($numr)){echo "<br>Количество проиндексированных Рамблером страниц: ".$numr.'<br>';} else{echo'<br>Сайт в Рамблере не индексирован'; }
// Если на странице были совпадения(тоесть был найден патерн поиска), то печатаем кусок из этого совпадения - нужную нам цифру страниц, если нет, то говорим о том, что сайт не индексирован рамблером.

Вот собственно и всё на сегодня, досвиданья вам :-)

 
     
Евгений Евсеев - legat\Собака/nm.ru

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.php1sql1ssi
Отписаться

В избранное