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

 PHP.SU

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


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

> Без описания
Set
Отправлено: 10 Июня, 2010 - 08:35:36
Post Id


Новичок


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


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




Добрый день, бьюсь тут над одной задачей не могу решить.
Задача есть переменная в которой находится текст. Нужно в этом тексте найти сумму, преобразовать в число и умножив на нужный коэффициент вернуть на место.
Мое решение:
PHP:
скопировать код в буфер обмена
  1. $pos = "</tr>    
  2.    </thead>
  3.    <tbody>
  4.              <tr>
  5. <td style='text-align: right;'>600&nbsp;руб.<br>";   // сам текст
  6.  
  7. function repl ($p1)
  8. {
  9.      $nacenka = 1.05;
  10.      $p1 = str_replace ("&nbsp;", "", $p1);
  11.      settype ($p1, float);
  12.      $p1 = $p1 * $nacenka;
  13.      return $p1;
  14. }
  15. $pos1 = preg_replace ("/[0-9]*&nbsp;/", repl ('\0'), $pos);
  16. print_r ($pos1);

Но работать отказывается, думаю что загвоздка прячется в районе str_replace но что поправить не пойму.
Спасибо.


Отредактировано модератором: JustUserR, 10 Июня, 2010 - 10:56:42
Обрамил PHP-код в соответствующий BB-тег
 
 Top
qbik
Отправлено: 10 Июня, 2010 - 09:04:39
Post Id


Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Июнь 2010  


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




PHP:
скопировать код в буфер обмена
  1. <?PHP $pos = "</tr>
  2. </thead>
  3. <tbody>
  4. <tr>
  5. <td style='text-align: right;'>600&nbsp;руб.<br>"; // сам текст
  6.  
  7. function repl ($p1)
  8. {
  9. $nacenka = 1.05;
  10. $p1 = str_replace ("&nbsp;", "", $p1);
  11. settype ($p1, float);
  12. $p1 = $p1 * $nacenka;
  13.  
  14. return $p1;
  15. }
  16. //======
  17. preg_match("/[0-9]*&nbsp;/", $pos, $text);
  18. //======
  19. $pos1 = preg_replace ("/[0-9]*&nbsp;/", repl ($text[0]), $pos);
  20.  
  21. print_r ($pos1);
  22. ?>


SetТы в функцию не посылал цифру для обсчета, поэтому и получал 0

(Отредактировано автором: 10 Июня, 2010 - 09:05:25)

 
 Top
Set
Отправлено: 10 Июня, 2010 - 09:09:30
Post Id


Новичок


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


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




Офигеть, а я второй день бьюсь!
Спасибо огромное выручил! Улыбка
Не знаю как тут плюс поставить на форуме, но спасибо еще раз )

(Отредактировано автором: 10 Июня, 2010 - 09:11:10)

 
 Top
JustUserR
Отправлено: 10 Июня, 2010 - 11:00:16
Post Id



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


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


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




Set пишет:
pos1 = preg_replace ("/[0-9]*&nbsp;/", repl ('\0'), $pos);
Как другой вариант решения проблемы можно обрамить значение символьного класса в круглые скобки - в таком случае так как они являются запоминающими то создадут обратную ссылку которая как раз и должна передаться в функцию обработчки


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Set
Отправлено: 10 Июня, 2010 - 12:02:21
Post Id


Новичок


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


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




JustUserR пишет:
Как другой вариант решения проблемы можно обрамить значение символьного класса в круглые скобки - в таком случае так как они являются запоминающими то создадут обратную ссылку которая как раз и должна передаться в функцию обработчки

Покажи свой вариант если не сложно. Не совсем понял Улыбка

qbik пишет:
PHP:
скопировать код в буфер обмена
  1. <?PHP $pos = "</tr>
  2. </thead>
  3. <tbody>
  4. <tr>
  5. <td style='text-align: right;'>600&nbsp;руб.<br>"; // сам текст
  6.  
  7. function repl ($p1)
  8. {
  9. $nacenka = 1.05;
  10. $p1 = str_replace ("&nbsp;", "", $p1);
  11. settype ($p1, float);
  12. $p1 = $p1 * $nacenka;
  13.  
  14. return $p1;
  15. }
  16. //======
  17. preg_match("/[0-9]*&nbsp;/", $pos, $text);
  18. //======
  19. $pos1 = preg_replace ("/[0-9]*&nbsp;/", repl ($text[0]), $pos);
  20.  
  21. print_r ($pos1);
  22. ?>


SetТы в функцию не посылал цифру для обсчета, поэтому и получал 0


Обнаружил что этот вариант прокатывает если в контенте только одна переменная, которая нам нужна. Если в нем например их несколько то отображается только первая.
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP $pos = "</tr>
  3. </thead>
  4. <tbody>
  5. <tr>
  6. <td style='text-align: right;'>600&nbsp;руб.<br>
  7. <td style='text-align: right;'>300&nbsp;руб.<br>";
  8.  

если же использую функцию
preg_match_all("/[0-9]*&nbsp;/", $pos, $text);
то соответственно все это работает по последнему - то есть не работает.


Отредактировано модератором: JustUserR, 11 Июня, 2010 - 15:11:11
Исправил некоторые BB-теги
 
 Top
qbik
Отправлено: 10 Июня, 2010 - 13:45:33
Post Id


Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Июнь 2010  


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




Set функция preg_match("/[0-9]*&nbsp;/", $pos, $text);
помещяет в $text массив всех совпавших значений
следовательно можно сделать так

PHP:
скопировать код в буфер обмена
  1. foreach ($text as $word)
  2. {
  3. $pos1 = preg_replace ("/[0-9]*&nbsp;/", repl ($word), $pos);
  4. }


ps посмотрел маны, скорее всего работать тоже не будет, нужно так

PHP:
скопировать код в буфер обмена
  1. foreach ($text as $word)
  2. {
  3. $patt[]="/[0-9]*&nbsp;/";
  4. $repl[]=repl ($word);
  5. }
  6. $pos1 = preg_replace ($patt, $repl, $pos);
  7.  

(Добавление)
вывод
Цитата:
100 руб.200 руб.600 руб.10000 руб.

105руб.210руб.630руб.10500руб.

PHP:
скопировать код в буфер обмена
  1.  
  2. код
  3. <?PHP $pos = "</tr>
  4. </thead><tbody>100&nbsp;руб.<tr>200&nbsp;руб.<td style='text-align: right;'>600&nbsp;руб.<td style='text-align: right;'>10000&nbsp;руб.<br>"; // сам текст
  5.  
  6. function repl ($p1)
  7. {
  8. $nacenka = 1.05;
  9. $p1 = str_replace ("&nbsp;", "", $p1);
  10. settype ($p1, float);
  11. $p1 = $p1 * $nacenka;
  12.  
  13. return $p1;
  14. }
  15.  
  16. preg_match_all("/[0-9]*&nbsp;/", $pos, $text);
  17.  
  18.  
  19. echo $pos;
  20. echo "<br>";
  21. $text=$text[0];
  22. foreach ($text as $word)
  23. {
  24. $patt[]="/[0-9]*&nbsp;/";
  25. $repl[]=repl ($word);
  26. }
  27.  
  28. $pos1 = preg_replace ($patt, $repl, $pos,1);
  29. print_r ($pos1);
  30. ?>

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

 
 Top
JustUserR
Отправлено: 11 Июня, 2010 - 15:06:16
Post Id



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


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


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




Set пишет:
Покажи свой вариант если не сложно. Не совсем понял
Ваше регулярное выражение приведенное в первом сообщений содержало обратную ссылку в строке замены - а чтобы задейстовать определенную обратную ссылку нужно взять сохраняемый в нее фрагмент текста в запонимающие круглые скобки
Конкретно это preg_replace("/([0-9]*)\&nbsp;/", repl('$0'), $pos) - и также если вы используете определенную фунцию для замены то можно делать callback-вариант регулярного выражения
PS Тема содержит вопрос по регулярным выражениям - поэтому переношу ее в соответствующий раздел


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Set
Отправлено: 16 Июня, 2010 - 18:14:47
Post Id


Новичок


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


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




Спасибо большое все заработало, долго я бы это копал Улыбка
 
 Top
JustUserR
Отправлено: 17 Июня, 2010 - 11:03:30
Post Id



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


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


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




Set пишет:
Спасибо большое все заработало, долго я бы это копал
Пожалуйста! Вообще передача заменяемого значения в функции preg_replace осуществляется похожим образом вне зависимости от того имеется ли там чистая строка или некоторая функция над ней - во втором аргументе смотрятся все строковые переменные и константы и в них ищется дословное значение доллар+индекс или слеш+индекс для которого и происходит подстановка - причем поиск в стороквых константах происходит не относительно PHP-кода а относительно хранимых представлений данных - благодаря этому можно генерировать строки с заменой динамически


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 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