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
Форумы портала PHP.SU :: Версия для печати :: В переменной одно, на экран выводит другое, как так?
Форумы портала PHP.SU » » Если скрипт не работает » В переменной одно, на экран выводит другое, как так?

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

1. dmaw - 07 Июня, 2014 - 00:31:16 - перейти к сообщению
Как такое может быть?

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".
2. DelphinPRO - 07 Июня, 2014 - 00:52:58 - перейти к сообщению
в функцию units_test вы передаете строки

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

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

Доходчиво расписал?
3. dmaw - 07 Июня, 2014 - 10:51:43 - перейти к сообщению
DelphinPRO, да, спасибо, я понял откуда ноль.

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

PHP:
скопировать код в буфер обмена
  1. preg_replace("/(?U)(\[)([a-z]+)(_)(\d+)(\])/", units_text("$2","$4"), $text);
  2. //передаёт "$2" и "$4" вместо данных
4. Мелкий - 07 Июня, 2014 - 11:08:29 - перейти к сообщению
Потому что сначала вызывается units_text, и только потом - preg_replace.
Используйте preg_replace_callback
5. dmaw - 07 Июня, 2014 - 11:40:19 - перейти к сообщению
Спасибо ребята, понял:

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


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

 

Powered by ExBB FM 1.0 RC1