[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Где ошибка в скрипте?
D!mon
Здравстуйте!
Вот скрипт:
<?php
$test = "test.txt";
$a = 'mama<div id="lfgghjkd"> mila<div>fdsdfs sdsdf dfdsf<div>dsfsdfsdfsdf</div><div>dsfdsf sfsf</div></div> </div>ramu </div><div>dsgdfgdfgfd</div>';
$i = 0;
udal($a);
function udal($a){
global $i,$test;
preg_match_all("/(<\/*div.*?>.*?)</i",$a,$res,PREG_PATTERN_ORDER);
if(substr($res[1][0],0,2) == '<d'){
$i = $i+1;
if($i >= 0){
$a = ereg_replace($res[1][0],"",$a);
udal($a);
}
}

if(substr($res[1][0],0,2) == '</'){
$i = $i-1;
if($i >= 0){
$a = preg_replace("/<\/div>/","",$a,1);
udal($a);
}
if($i < 0){
$file = fopen($test,"a");
fwrite($file,$a.PHP_EOL);
fclose($file);
}
}
}

?>

Его предназначение: в строке существует один лишний тег </div>, необходимо убрать все пары тегов <div></div> и все что между ними ДО лишнего тега </div>.
В таком виде скрипт РАБОТАЕТ , но немного некоректно, а именно в файл почему-то записывается информация два раза.
И самое главное:
как осуществить запись в файл ВНЕ функции?
я пробовал так:
<?php
$test = "test.txt";
$a = 'mama<div id="lfgghjkd"> mila<div>fdsdfs sdsdf dfdsf<div>dsfsdfsdfsdf</div><div>dsfdsf sfsf</div></div> </div>ramu </div><div>dsgdfgdfgfd</div>';
$i = 0;
$b = udal($a);
$file = fopen($test,"a");
fwrite($file,$b.PHP_EOL);
fclose($file);
function udal($a){
global $i,$test;
preg_match_all("/(<\/*div.*?>.*?)</i",$a,$res,PREG_PATTERN_ORDER);
if(substr($res[1][0],0,2) == '<d'){
$i = $i+1;
if($i >= 0){
$a = ereg_replace($res[1][0],"",$a);
udal($a);
}
}

if(substr($res[1][0],0,2) == '</'){
$i = $i-1;
if($i >= 0){
$a = preg_replace("/<\/div>/","",$a,1);
udal($a);
}
if($i < 0){
return $a;
}
}
}

?>

но ничего не выходит... blink.gif



Спустя 1 час, 23 минуты, 59 секунд (10.06.2010 - 17:47) sl4mmer написал(а):
Цитата
необходимо убрать все пары тегов <div></div> и все что между ними ДО лишнего тега </div>.



объясни попонятнее плз -ячет таки не вкурил какой результат долже получиться

Спустя 13 минут, 40 секунд (10.06.2010 - 18:01) D!mon написал(а):
вот есть строка:
$a = 'mama<div id="lfgghjkd"> mila<div>fdsdfs sdsdf dfdsf<div>dsfsdfsdfsdf</div><div>dsfdsf sfsf</div></div> </div>ramu </div><div>dsgdfgdfgfd</div>';

в ней каждый тег <div> имеет закрывающий тег </div> и какой-то набор символов между ними, все вместе - <div>dsfsdfsdfsdf</div>.Также в этой строке есть один лишний тег </div>, который не имеет открывающего.Задача такая: необходимо удалить все теги которые имеют пару и все что между ними и стоят до лишнего тега
</div>.
Правильный результат выполнения программы:
mama ramu </div><div>dsgdfgdfgfd</div>

Спустя 7 часов, 11 минут, 6 секунд (11.06.2010 - 01:12) sl4mmer написал(а):
плин.. я пйан щас слегка.. но с утра покручу твой скриптик - делать нефиг)

Спустя 1 день, 12 часов, 30 минут, 19 секунд (12.06.2010 - 13:42) D!mon написал(а):
и что, никто не знает?

Спустя 3 часа, 13 минут, 42 секунды (12.06.2010 - 16:56) Dron19 написал(а):
я сначала посмеялся)) зачем использовать регулярное выражение?????? Для нагрузки на сервер??? Из переменной просто уберите лишний тэг и все или Вы это делаете для изучения?

Спустя 2 дня, 41 минута, 16 секунд (14.06.2010 - 17:37) D!mon написал(а):
Цитата (Dron19 @ 12.06.2010 - 13:56)
я сначала посмеялся)) зачем использовать регулярное выражение?????? Для нагрузки на сервер??? Из переменной просто уберите лишний тэг и все или Вы это делаете для изучения?

Это Вы про что?

Спустя 18 часов, 11 минут, 14 секунд (15.06.2010 - 11:49) SlavaFr написал(а):
@D!mon как то
<div>dsgdfgdfgfd</div>
в твоем желаемом результате невписывается в описание которое ты зделал.
так как ты нам проблему описал, то должно остатся

mama ramu </div>

Спустя 4 часа, 19 минут, 22 секунды (15.06.2010 - 16:08) D!mon написал(а):
SlavaFr, попытаюсь разложить исходную строку по тегам(пары тегов выделены одним цветом):
mama<div id="lfgghjkd"> mila<div>fdsdfs sdsdf dfdsf<div>dsfsdfsdfsdf</div><div>dsfdsf sfsf</div></div> </div>ramu </div><div>dsgdfgdfgfd</div>

вот, так по моему мнению выглядит набор тегов ДО лишнего(самого большого).
Дальше действует алгоритм:
находит первый тег, вычисляет что он ОТКРЫВАЮЩИЙ и в этом случае прибавляет единицу к исходному значению $i = 0; получаем 1.Потом находим второй тег вычисляем что он тоже открывающий и опять прибавляем единицу, получаем 2.Затем находим третий тег и опять он открывающий и получаем 3.Потом находим тег, оп! а он ЗАКРЫВАЮЩИЙ и отнимаем единицу получаем 2.и так далее.В итоге при обнаружении лишнего тега значение $i будет равно -1, в этом случае полученная строка пишется в файл и программа завершается.

НО!
Вопрос усовершенствования алгоритма - это вопрос второстепенный, так сказать для профи.

Самое главное - это почему не работает конструкция return ????Почему я не могу записать полученную строку без лишних тегов вне функции?

Спустя 16 минут, 32 секунды (15.06.2010 - 16:25) tomash написал(а):
Я думаю всю логику функции нужно выполнять при условии $i=>0

Спустя 1 час, 20 минут, 15 секунд (15.06.2010 - 17:45) SlavaFr написал(а):
да ты просто слово ретурн забыл

function udal($a){
global $i,$test;
preg_match_all("/(<\/*div.*?>.*?)</i",$a,$res,PREG_PATTERN_ORDER);
if(substr($res[1][0],0,2) == '<d'){
$i = $i+1;
if($i >= 0){
$a = ereg_replace($res[1][0],"",$a);
return udal($a);
}
}

if(substr($res[1][0],0,2) == '</'){
$i = $i-1;
if($i >= 0){
$a = preg_replace("/<\/div>/","",$a,1);
return udal($a);
}
if($i < 0){
return $a;
}
}
}

Спустя 2 минуты, 5 секунд (15.06.2010 - 17:47) SlavaFr написал(а):
а в общем конечно код дерьмовый,
не форматированный и намешал preg и erreg.
a global, так это вообще надо запретить.

Спустя 9 минут, 8 секунд (15.06.2010 - 17:56) D!mon написал(а):
Ну наконец то! biggrin.gif
Всем спасиб!

Отдельный респектище SlavaFr!
все работает!!!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.