Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: preg_replace_callback

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: не выходит каменный цветок
Hidalgo
Отправлено: 31 Марта, 2015 - 23:06:30
Post Id



Частый гость


Покинул форум
Сообщений всего: 245
Дата рег-ции: Февр. 2012  
Откуда: Димитровград


Помог: 1 раз(а)




Доброго времени суток!
Прошу помочь с функцией preg_replace_callback
Раньше было так (парсинг bbcode, просто в качестве примера):
PHP:
скопировать код в буфер обмена
  1. $simple_search = array(
  2.     '/\[b\](.*?)\[\/b\]/is',
  3.     '/\[i\](.*?)\[\/i\]/is',
  4.     '/\[u\](.*?)\[\/u\]/is');
  5.  
  6. $simple_replace = array(
  7.    '<strong>$1</srong>',
  8.     '<i>$1</i>',
  9.     '<u>$1</u>');
  10.  
  11. function parse($string) {
  12.     $s = (string) $string;
  13.     $s = preg_replace($simple_search, $simple_replace, $s);
  14.     return $s;
  15. }
  16.  

Встала задача переписать этот кусок под функцию preg_replace_callback, но чет у меня туго с пониманием как она работает. Маны читал и на русском и на буржуйском. Получается что ничего не получается. Весь день убил.
Помогите плиз Огорчение

(Отредактировано автором: 31 Марта, 2015 - 23:07:44)

 
 Top
Hidalgo
Отправлено: 01 Апреля, 2015 - 10:35:09
Post Id



Частый гость


Покинул форум
Сообщений всего: 245
Дата рег-ции: Февр. 2012  
Откуда: Димитровград


Помог: 1 раз(а)




PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $input = "просто [i]текст[/i] еще [b]тексты[/b] потом [u]просто[/u] текст";
  3.  
  4. function parseTagsRecursive($input)
  5. {
  6.  
  7.  $simple_search = array(
  8.     '/\[b\](.*?)\[\/b\]/is',
  9.     '/\[i\](.*?)\[\/i\]/is',
  10.     '/\[u\](.*?)\[\/u\]/is',
  11.   );
  12.     if (is_array($input))
  13.     {
  14.     $input = array(
  15.     '<strong>' . $input[1] . '</strong>',
  16.     '<em>' . $input[1] . '</em>',
  17.     '<u>' . $input[1] . '</u>'
  18.   );
  19.                 echo '<pre>';
  20.                 var_dump($input);
  21.                 echo '</pre>';
  22.     }
  23.     return preg_replace_callback($simple_search, 'parseTagsRecursive', $input);
  24. }
  25.  
  26. $output = parseTagsRecursive($input);
  27. print_r($output);
  28. ?>


вывод var_dump:
CODE (htmlphp):
скопировать код в буфер обмена
  1. array (size=3)
  2.   0 => string '<strong>тексты</strong>' (length=29)
  3.   1 => string '<em>тексты</em>' (length=21)
  4.   2 => string '<u>тексты</u>' (length=19)
  5. array (size=3)
  6.   0 => string '<strong>текст</strong>' (length=27)
  7.   1 => string '<em>текст</em>' (length=19)
  8.   2 => string '<u>текст</u>' (length=17)
  9. array (size=3)
  10.   0 => string '<strong>просто</strong>' (length=29)
  11.   1 => string '<em>просто</em>' (length=21)
  12.   2 => string '<u>просто</u>' (length=19)


Вывод print_r:
CODE (htmlphp):
скопировать код в буфер обмена
  1. просто Array еще Array потом Array текст


Херня в общем получается Огорчение

Цитата:
preg_replace_callback() возвращает массив, если параметр subject является массивом, иначе возвращается строка. В случае ошибок возвращается NULL

Почему же тогда возвращается строка а не массив?

(Отредактировано автором: 01 Апреля, 2015 - 11:04:10)

 
 Top
Faraon-san
Отправлено: 01 Апреля, 2015 - 11:20:23
Post Id



Посетитель


Покинул форум
Сообщений всего: 318
Дата рег-ции: Сент. 2013  


Помог: 8 раз(а)




а зачем его переписывать?
 
 Top
Hidalgo
Отправлено: 01 Апреля, 2015 - 11:25:05
Post Id



Частый гость


Покинул форум
Сообщений всего: 245
Дата рег-ции: Февр. 2012  
Откуда: Димитровград


Помог: 1 раз(а)




Faraon-san пишет:
а зачем его переписывать?

А как надо?
 
 Top
Faraon-san
Отправлено: 01 Апреля, 2015 - 11:39:39
Post Id



Посетитель


Покинул форум
Сообщений всего: 318
Дата рег-ции: Сент. 2013  


Помог: 8 раз(а)




я имею ввиду, функция preg_replace выполняет свою функцию? зачем переписывать код подстраиваю другую функцию.

(Отредактировано автором: 01 Апреля, 2015 - 11:41:46)

 
 Top
Hidalgo
Отправлено: 01 Апреля, 2015 - 11:42:45
Post Id



Частый гость


Покинул форум
Сообщений всего: 245
Дата рег-ции: Февр. 2012  
Откуда: Димитровград


Помог: 1 раз(а)




Faraon-san пишет:
я имею ввиду, функция preg_replace выполняет свою функцию? зачем переписывать код подстраиваю другую функцию, это будет ресурсо затратно, т.к. придется в цикле проверять.

К сожалению на хостинге PHP стоит версии 5.5
 
 Top
Faraon-san
Отправлено: 01 Апреля, 2015 - 11:44:35
Post Id



Посетитель


Покинул форум
Сообщений всего: 318
Дата рег-ции: Сент. 2013  


Помог: 8 раз(а)




и там это не работает? в версии 5.5 убрали только модификатор e и все.
 
 Top
Hidalgo
Отправлено: 01 Апреля, 2015 - 11:55:51
Post Id



Частый гость


Покинул форум
Сообщений всего: 245
Дата рег-ции: Февр. 2012  
Откуда: Димитровград


Помог: 1 раз(а)




Ну вроде как из-за этой уязвимости этого и рекомендуют использовать preg_replace_callback вместо preg_replace?
Или можно тупо убрать модификатор и все? Не понял

(Отредактировано автором: 01 Апреля, 2015 - 12:08:38)

 
 Top
Faraon-san
Отправлено: 01 Апреля, 2015 - 12:18:19
Post Id



Посетитель


Покинул форум
Сообщений всего: 318
Дата рег-ции: Сент. 2013  


Помог: 8 раз(а)




модификатор e используют для исполнения php кода после замены.
аналог функции eval, просто не используй этот модификатор и все.
 
 Top
Мелкий Супермодератор
Отправлено: 01 Апреля, 2015 - 12:21:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Так ведь в приведённом коде нет модификатора e.


-----
PostgreSQL DBA
 
 Top
DeepVarvar Супермодератор
Отправлено: 01 Апреля, 2015 - 12:43:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Зато там есть XSS ))
 
 Top
Hidalgo
Отправлено: 01 Апреля, 2015 - 13:24:01
Post Id



Частый гость


Покинул форум
Сообщений всего: 245
Дата рег-ции: Февр. 2012  
Откуда: Димитровград


Помог: 1 раз(а)




Так что посоветуете? Просто модификатор убрать или все таки дальше ковыряться с preg_replace_callback?
 
 Top
Faraon-san
Отправлено: 01 Апреля, 2015 - 14:06:49
Post Id



Посетитель


Покинул форум
Сообщений всего: 318
Дата рег-ции: Сент. 2013  


Помог: 8 раз(а)




так у тебя в первом посте где используется preg_replace, нет этого модификатора.
вообщем оставь все как есть, и не парься по поводу preg_replace, там все корректно работает.

(Отредактировано автором: 01 Апреля, 2015 - 14:09:00)

 
 Top
Hidalgo
Отправлено: 01 Апреля, 2015 - 16:26:22
Post Id



Частый гость


Покинул форум
Сообщений всего: 245
Дата рег-ции: Февр. 2012  
Откуда: Димитровград


Помог: 1 раз(а)




Faraon-san пишет:
так у тебя в первом посте где используется preg_replace, нет этого модификатора.
вообщем оставь все как есть, и не парься по поводу preg_replace, там все корректно работает.

В примере - просто пример. В реальности есть модификаторы.
 
 Top
Faraon-san
Отправлено: 01 Апреля, 2015 - 17:58:08
Post Id



Посетитель


Покинул форум
Сообщений всего: 318
Дата рег-ции: Сент. 2013  


Помог: 8 раз(а)




Если он там не нужен, то просто убери.
Если сомневаешься, то выкладывай код, посмотрим.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB