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 :: Версия для печати :: Замена с помощью preg_replace
Форумы портала PHP.SU » PHP » Регулярные выражения » Замена с помощью preg_replace

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

1. Set - 10 Июня, 2010 - 08:35:36 - перейти к сообщению
Добрый день, бьюсь тут над одной задачей не могу решить.
Задача есть переменная в которой находится текст. Нужно в этом тексте найти сумму, преобразовать в число и умножив на нужный коэффициент вернуть на место.
Мое решение:
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 но что поправить не пойму.
Спасибо.
2. qbik - 10 Июня, 2010 - 09:04:39 - перейти к сообщению
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
3. Set - 10 Июня, 2010 - 09:09:30 - перейти к сообщению
Офигеть, а я второй день бьюсь!
Спасибо огромное выручил! Улыбка
Не знаю как тут плюс поставить на форуме, но спасибо еще раз )
4. JustUserR - 10 Июня, 2010 - 11:00:16 - перейти к сообщению
Set пишет:
pos1 = preg_replace ("/[0-9]*&nbsp;/", repl ('\0'), $pos);
Как другой вариант решения проблемы можно обрамить значение символьного класса в круглые скобки - в таком случае так как они являются запоминающими то создадут обратную ссылку которая как раз и должна передаться в функцию обработчки
5. Set - 10 Июня, 2010 - 12:02:21 - перейти к сообщению
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);
то соответственно все это работает по последнему - то есть не работает.
6. qbik - 10 Июня, 2010 - 13:45:33 - перейти к сообщению
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. ?>
7. JustUserR - 11 Июня, 2010 - 15:06:16 - перейти к сообщению
Set пишет:
Покажи свой вариант если не сложно. Не совсем понял
Ваше регулярное выражение приведенное в первом сообщений содержало обратную ссылку в строке замены - а чтобы задейстовать определенную обратную ссылку нужно взять сохраняемый в нее фрагмент текста в запонимающие круглые скобки
Конкретно это preg_replace("/([0-9]*)\&nbsp;/", repl('$0'), $pos) - и также если вы используете определенную фунцию для замены то можно делать callback-вариант регулярного выражения
PS Тема содержит вопрос по регулярным выражениям - поэтому переношу ее в соответствующий раздел
8. Set - 16 Июня, 2010 - 18:14:47 - перейти к сообщению
Спасибо большое все заработало, долго я бы это копал Улыбка
9. JustUserR - 17 Июня, 2010 - 11:03:30 - перейти к сообщению
Set пишет:
Спасибо большое все заработало, долго я бы это копал
Пожалуйста! Вообще передача заменяемого значения в функции preg_replace осуществляется похожим образом вне зависимости от того имеется ли там чистая строка или некоторая функция над ней - во втором аргументе смотрятся все строковые переменные и константы и в них ищется дословное значение доллар+индекс или слеш+индекс для которого и происходит подстановка - причем поиск в стороквых константах происходит не относительно PHP-кода а относительно хранимых представлений данных - благодаря этому можно генерировать строки с заменой динамически

 

Powered by ExBB FM 1.0 RC1