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 :: В переменной одно, на экран выводит другое, как так?

 PHP.SU

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


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

> Без описания
dmaw
Отправлено: 07 Июня, 2014 - 00:31:16
Post Id



Частый гость


Покинул форум
Сообщений всего: 227
Дата рег-ции: Сент. 2009  
Откуда: Беларусь, Витебск


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




Как такое может быть?

PHP:
скопировать код в буфер обмена
  1.  
  2. $text = 'Тут какой-то текст [test_5] Тут какой-то текст';
  3.  
  4. echo preg_replace("/(?U)(\[)([a-z]+)(_)(\d+)(\])/", units_text("\${2}","\${4}"), $text);
  5.  
  6. function units_text($test, $id)
  7. {
  8.         if($id == 0)
  9.         {
  10.                 return $id.'***'; //на экран выводит: 5***
  11.         }
  12. }
  13.  

Части "test" и "5" скрипт воспринимает только как "0", но на экран выводит "test" и "5".

(Отредактировано автором: 07 Июня, 2014 - 00:32:36)

 
 Top
DelphinPRO
Отправлено: 07 Июня, 2014 - 00:52:58
Post Id



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


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


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




в функцию units_test вы передаете строки

при сравнении строки с числом, строка приводится к числу. Данная строка будет приведена к числу 0 (почему так - читайте на php.net). Ноль сравнивается с нулем, что дает истину и выполняется тело условия if. В результате функция вернет строку

Данная строка будет использована в качестве замены в функции preg_replace. Так как здесь используется спец-выражение, то оно будет заменено на четвертую секцию регулярки
"/(?U)(\[)([a-z]+)(_)(\d+)(\])
которая в данном случае соответствует числу 5

Доходчиво расписал?


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
dmaw
Отправлено: 07 Июня, 2014 - 10:51:43
Post Id



Частый гость


Покинул форум
Сообщений всего: 227
Дата рег-ции: Сент. 2009  
Откуда: Беларусь, Витебск


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




DelphinPRO, да, спасибо, я понял откуда ноль.

Но почему в функцию ссылки не передают то, что нужно?

PHP:
скопировать код в буфер обмена
  1. preg_replace("/(?U)(\[)([a-z]+)(_)(\d+)(\])/", units_text("$2","$4"), $text);
  2. //передаёт "$2" и "$4" вместо данных

(Отредактировано автором: 07 Июня, 2014 - 10:52:24)

 
 Top
Мелкий Супермодератор
Отправлено: 07 Июня, 2014 - 11:08:29
Post Id



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


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


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




Потому что сначала вызывается units_text, и только потом - preg_replace.
Используйте preg_replace_callback


-----
PostgreSQL DBA
 
 Top
dmaw
Отправлено: 07 Июня, 2014 - 11:40:19
Post Id



Частый гость


Покинул форум
Сообщений всего: 227
Дата рег-ции: Сент. 2009  
Откуда: Беларусь, Витебск


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




Спасибо ребята, понял:

PHP:
скопировать код в буфер обмена
  1. preg_replace_callback("/(?U)(\[)([a-z]+)(_)(\d+)(\])/", "units_text", $text);
  2. function units_text_replace($arr)
  3. {
  4.     print_r($arr);
  5. }


Заработало! Радость

(Отредактировано автором: 07 Июня, 2014 - 11:41:03)

 
 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