Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Рекурсия
 
 автор: Deed   (28.06.2015 в 08:24)   письмо автору
 
 

Доброго дня!
Простите за тупизну, со мной такое бывает.

<?
$str
=' <p> <p><p> <p><p><br />====<img srcdfj двоатотди vdnnv</p></p> </p></p></p>';

function 
brp(&$s){
    
$s=trim($s);
    if(
preg_match("/^<p>/ui",$s)){
        
$s=preg_replace("/^<p>\s*|\s*<\/p>$/ui","",$s);
        
$s=trim($s);
        if(
preg_match("/^<p>/ui",$s)){
                    
brp($s);
        }
        else{
            return 
$s;
        }
    }
        else{
            return 
$s;
        }
}
echo 
brp($str);
?>


Вот, возвращается пустая строка.
WHY???

Спасибо.

  Ответить  
 
 автор: Trianon   (28.06.2015 в 09:04)   письмо автору
 
   для: Deed   (28.06.2015 в 08:24)
 

по первому условному пути (когда %subject%) функция ничего не возвращает. Нету оператора return ...;

  Ответить  
 
 автор: Deed   (28.06.2015 в 09:18)   письмо автору
 
   для: Trianon   (28.06.2015 в 09:04)
 

Спасибо за ответ, но, если строка НЕ начинается с "<p>", return, ведь, прописан.

  Ответить  
 
 автор: Valick   (28.06.2015 в 09:28)   письмо автору
 
   для: Deed   (28.06.2015 в 09:18)
 

а с чего она начинается?

  Ответить  
 
 автор: Deed   (28.06.2015 в 09:35)   письмо автору
 
   для: Valick   (28.06.2015 в 09:28)
 

Она после трима начинается с <p>.

<?

$str
=' <p> <p><p> <p><p><br />====<img srcdfj двоатотди vdnnv</p></p> </p></p></p>';

function 
brp($s){
     
$s=trim($s);
     if(
preg_match("/^<p>/ui",$s)){
     
$s=preg_replace("/^<p>\s*|\s*<\/p>$/ui","",$s);
     
brp($s);
    }
    else{
        return 
$s;
    }
}
echo 
brp($str);

?>


Ну-у, как бы для начала ф-ция делает трим, потом смотрит, если первые символы - <p>, она их режет, и, по идее, снова вызывает саму себя. Дальше, если строка с параграфа не начинается, ф-ция выводит результат.
Так, вроде бы.

  Ответить  
 
 автор: Trianon   (28.06.2015 в 11:27)   письмо автору
 
   для: Deed   (28.06.2015 в 09:35)
 

>Ну-у, как бы для начала ф-ция делает трим, потом смотрит, если первые символы - <p>, она их режет, и, по идее, снова вызывает саму себя....

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

  Ответить  
 
 автор: Deed   (28.06.2015 в 10:00)   письмо автору
 
   для: Valick   (28.06.2015 в 09:28)
 

В общем, все это дело заменил на

<?
$str
=' <p> <p><p> <p><p><br />====<img srcdfj двоатотди vdnnv</p></p> </p></p></p>';

$str=preg_replace("/^(\s*<p>\s*)+|(\s*<\/p>\s*)+$/ui"""$str);

?>


Но хотелось бы понять, почему не сработала здесь рекурсия.

  Ответить  
 
 автор: Igorek   (28.06.2015 в 11:11)   письмо автору
 
   для: Deed   (28.06.2015 в 08:24)
 

because))
Важная поправка - возвращается не пустая строка, а NULL
Когда функция возвращает NULL? Если явно вернуть NULL или, если ничего не возвращать. У вас второй случай.
Настройте отладчик, выполните всю эту канитель по шагам и тогда поймете в чем дело

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования