Вернуться на Страничку новостей.

07.10.2009

Начинаем дружбу с PHP
Снова программа написана на предмет работы с html-текстом.

Это такая-же программа, что и написанная мной на С++ от 2 октября (см.архив "Полезная утилита"),
только в этот раз программа написана на PHP! Да наконец то оседлал конька.
Долгое время у меня не было инструментария - интерпретатора PHP, но теперь
следуя народным советам Кузнецова скачал и переустановил Апач и интерпретатор
PHP. И еще хорошо то, что следуя его советам установил новую опцию,
благодаря которой отлаживать скрипты можно не выходя в интернет, примерно как
обычные html-скрипты. Нижепоказанную программу о работе с файлами и строками
я так и отлаживал. Быстро и эффективно!

Но главный эффект нижеуказанной программы состоит в том, что использована возможность,
которая есть в PHP и которой нет в обычном С++: считывать имена файлов из директории.
Эти имена были считаны, помещены в обычный массив, ну а дальше - дело техники.
Каждый файл был открыт, модифицирован, и помещен в новую директорию под своим
прежним названием.

Первоначально, пока я не озадачился этой проблемой, я каждый из 400(!) файлов
должен был открыть, три участка текста в каждом файле удалить, у нескольких предложений
в каждом файле заменить их части на новые. Эта программа сделала все за одну секунду(!)
во всех 400 файлах. Разве не впечатляет? И этот пример показал, что такое PHP!

///////////

Программа обрабатывает сразу все файлы из одной директории и затем копирует их в другую
директорию под прежним именем. С каждым файлом программа делает следующее:

1. Убирает все строки от начала файла и до первой встречи лексемы "<h2>".
Назовем это Чердак.

2. Убирает все строки от первой встречи лексемы "<center>" до конца файла.
Назовем это Подвал.

3. В дополнение убирает еще фрагмент из середины текста.

4. Заменяет еще и длинное наименование
пути: "<img src="www.ПЕРВЫЕ ШАГИ.ru __ Шаг 213 - Стан и тд ... "

Заменяет на:"<IMG SRC="images" и ставит тег <P> перед лексемой "<IMG SRC="images"

Эта программа выбирает по одному маркеру.
Не будем усложнять. Работает - пусть работает.

Вот код этой выдающейся программы. Как всегда, бесплатно :-)!


<?php
//объявим массивы
$masNameFrom = array();
$masNameTo = array();
$str1 = "<h2>"; // лексема для поиска
$str2 = "<table"; // лексема для поиска
$str3 = "<div style"; // лексема для поиска
$str4 = "<center>"; // лексема для поиска
$str5 = "_files"; // лексема для поиска
$strInst = "<IMG SRC=\"images"; // лексема для поиска

//-----------------------------

// откроем файл для записи ошибок
$filename = "error.txt";
if(!($myFile = fopen($filename, "w"))) {
print("Error: ");
print("'$filename' could not be created\n");
exit;
}

// open directory
$myDirectoryFrom = opendir("from1");

//-----------------------------

$n=0;

// считаем в массив имена файлов из from1
while(FALSE !== ($entryName = readdir($myDirectoryFrom))) {

$masNameFrom[$n] = $entryName;
$n++;
}

// сосчитаем количество элементов в массиве
$indexLimit = count($masNameFrom);

///////////////////////////////////////////////

// для каждого имени файла повторим цикл
for($index=2; $index < $indexLimit; $index++) {
//введем флаги
$flag1 = 0;
$flag2 = 0;
$flag3 = 0;
$flag4 = 0;
$flag5 = 0;
$flag6 = 0;

//---------------------------
// откроем файл для чтения
$Temp = "from1/";
$filenameFrom = "$Temp$masNameFrom[$index]";

if(!($myFileFrom = fopen($filenameFrom, "r"))) {

fputs($myFile, "'$filenameFrom' could not be opened\n" );
exit;
}

//---------------------------
//откроем файл для записи
$Temp1 = "to1/";
$filenameTo = "$Temp1$masNameFrom[$index]";

if(!($myFileTo = fopen($filenameTo, "w"))) {

fputs($myFile, "'$filenameTo' could not be created\n" );
exit;
}

//---------------------------


////////////////////////////////////////////////////////
//// Главный цикл
////////////////////////////////////////////////////////\
//считаем построчно из файла from в файл to
while(!feof($myFileFrom)) {

//читаем строку из файла
$myLine = fgets($myFileFrom, 255);

$n = 0;
$n1 = 0;

//-----------------------------------------------------------
// Уберем чердак
while(strlen($myLine)>0 && $flag1==0 ) {//если строка не пуста

$s1 = $myLine;
$n = strpos($myLine,$str1); // найдем позицию вхождения "<h2>" в $myLine

// если лексема есть
if($n > 0) {

$s1 = strstr($myLine, $str1 ); //левее n все отсекаем
$myLine = $s1;

$flag1++;
break;

}
else {
break;
}

}//end while

if($flag1==0) continue;

//-----------------------------------------------------------
// Убираем середину 1
while(strlen($myLine)>0 && $flag2==0 ) {//если строка не пуста

$s1 = $myLine; $n = strpos($myLine,$str2); // найдем позицию вхождения "<table" в $myLine

// если лексема есть
if($n > 0) {

$s1 = substr($myLine, 0, $n ); //правее n все отсекаем
$myLine = $s1;
//запишем измененную строку в новый файл
fputs($myFileTo, $myLine);

$flag2++;
break;
}
else {
//запишем строку в новый файл
fputs($myFileTo, $myLine);
break;
}

}//end while

if($flag2==0) continue;
//-----------------------------------------------------------
// Убираем середину 2
while(strlen($myLine)>0 && $flag3==0 ) {//если строка не пуста

$s1 = $myLine;
$n = strpos($myLine,$str3); // найдем позицию вхождения "<div style" в $myLine

// если лексема есть
if($n > 0) {

$s1 = strstr($myLine, $str3 ); //левее n все отсекаем
$myLine = $s1;
$flag3++;
break;
}
else {
break;
}

}//end while

if($flag3==0) continue;

$q = strlen($myLine);

//-----------------------------------------------------------
// Убираем IMG
$w=0;
while(strlen($myLine)>0 && $flag4==0 && $flag5==0) {//если строка не пуста

if($w==10)break;
$w++;

$s1 = $myLine;
$s2 = $myLine;
$n = strpos($myLine,$str5); // найдем позицию вхождения "_files" в $myLine
$n1 = strpos($myLine,$str4); // найдем позицию вхождения "<center>" в $myLine

if($n1>0){

//найдена лексема <center>
$flag4++;
$flag5++;
}

// если лексемы в строке нет, то запишем строку и
// выйдем из цикла, чтобы прочесть следующую строку
if($n <= 0 && $flag4==0){

//лексемы нет
//запишем строку в новый файл
fputs($myFileTo, $myLine);
break;
}
if($n > 0 && $flag4==0 ){//лексема есть
//модифицируем строку и
//запишем измененную строку в новый файл
$s1 = strstr($myLine, $str5 ); //левее n все отсекаем
$s5 = strstr($myLine, "/" ); //левее n все отсекаем
$myLine = "<P>$strInst$s5";

fputs($myFileTo, $myLine);
break;

}

}//end while

if($flag5==0) continue;

//-----------------------------------------------------------
// Уберем подвал
while(strlen($myLine)>0 && $flag6==0 ) {//если строка не пуста

$s1 = $myLine;
$n = strpos($myLine,$str4); // найдем позицию вхождения "<center>" в $myLine

// если лексема есть
if($n > 0) {

$s1 = substr($myLine, 0, $n ); //правее n все отсекаем
$myLine = $s1;
//запишем измененную строку в новый файл
fputs($myFileTo, $myLine);

$flag6++;
break;

}
else {
//запишем строку в новый файл
fputs($myFileTo, $myLine);
break;
}

}//end while

if($flag6==0) continue;
//------------------------------------------

}//end while главный

///////////////////////////////////////////

// закроем файлы
fclose($myFileFrom);
fclose($myFileTo);

}//end for

//--------------------------------
// close directory
closedir($myDirectoryFrom);
fclose($myFile);

//-------------------------------

?>

Hosted by uCoz