Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Чередующаяся замена переменных
 
 автор: broker   (17.04.2005 в 19:42)   письмо автору
 
 

Как можно в строке заменить $a на $b и $c в таком порядке: если $a найден в первые то заменяем его на $b, а второй раз заменяем на $c и ...( в нечетном заменяем на $b, а в четном на $c)

   
 
 автор: cheops   (17.04.2005 в 22:42)   письмо автору
 
   для: broker   (17.04.2005 в 19:42)
 

Это лучше сделать при помощи функции обратного вызова и preg_replace_callback(), которые доступны, если воспрользоваться регулярными выражениями
<?php
  
// В переменной $text находится исходный текст
  
$text "...";

  
$first true;
  
// функция обратного вызова
  
function zebra($matches
  {
    
// Флаг принимает значение true, если это
    // первая замена и false в противном случае
    
GLOBAL $first;
    
// Переменные
    
$b "Текст замены для b";
    
$c "Текст замены для c";
    
// Если первый раз, то меняем на $b
    
if($first)
    {
      
$first = !$first;
      return 
$b;
    }
    
// Если второй, то на $c
    
else
    {
      
$first = !$first;
      return 
$c;
    }
  }
  
// Производим замену $a в тексте
  
echo preg_replace_callback(
              
"|$a|i",
              
"zebra",
              
$text);
?>

   
 
 автор: broker   (18.04.2005 в 10:11)   письмо автору
 
   для: cheops   (17.04.2005 в 22:42)
 

Сheops Спасиб ). А я тут пробовал с двумя строчными переменными и еще с циклом ... вообщем не красиво у меня получился.. Это то что надо)

   
 
 автор: broker   (18.04.2005 в 16:36)   письмо автору
 
   для: cheops   (17.04.2005 в 22:42)
 

Ну я немного изменил, но все работает:

<?php
  $first 
false;
  function 
myfunc()
  {
    GLOBAL 
$first;
    
$b "<b>";
    
$c "</b>";
    
$first = !$first;
    if(
$first) { return $b; } else { return $c; }
  }
  function 
func1($text){
    
$text preg_replace_callback("|\002|i","myfunc",$text);
    return 
$text;
  }
  echo 
func1("Привет Как дела ?");
?>

Думаю аналогично что можно создать такую функцию в классе тоже :

<?php

class myclass {
var  
$first false;

function 
myfunc()
  {
    
$b "<b>";
    
$c "</b>";
    
$this->first = !$this->first;
    if(
$this->first) { return $b; } else { return $c; }
  }
  
function 
func1($text)
  {
    
$text preg_replace_callback("|\002|i","{$this->myfunc()}",$text);
    return 
$text;
  }


}
$class1 = new myclass;
  echo 
$class1->func1("Привет Как дела ?");

?>

Но к сажелению и тут без ошибок не как не обойтись ...

Warning: preg_replace_callback() [function.preg-replace-callback]: requires argument 2, '<b>', to be a valid callback in C:\server\htdocs\wewe2.php on line 16

Что тут может быть не понимаю, все вроде бы нормально написано...

   
 
 автор: cheops   (18.04.2005 в 23:05)   письмо автору
 
   для: broker   (18.04.2005 в 16:36)
 

Функция обратного вызова myfunc() обязательно должна иметь параметр, через который передаётся массив вхождений, даже если вы его не используете в работе функции.

   
 
 автор: broker   (19.04.2005 в 18:12)   письмо автору
 
   для: cheops   (17.04.2005 в 22:42)
 

Во первых без параметра в обычном программе нет ошибок, я тут передал параметр и без разницы:

<?php
class myclass {
var  
$first false;

function 
myfunc($mode)
  { if (
$mode==0){
      
$b "<b>";
      
$c "</b>";
    }else{
           
$b "<u>";
           
$c "</u>";
         }
    
$this->first = !$this->first;
    if(
$this->first) { return $b; } else { return $c; }
  }
  
function 
func1($text)
  {
    
$text preg_replace_callback("|\002|i","{$this->myfunc(1)}",$text);
    return 
$text;
  }

}
$class1 = new myclass;
  echo 
$class1->func1("Привет Как дела ?");
?>

Warning: preg_replace_callback() [function.preg-replace-callback]: requires argument 2, '<u>', to be a valid callback in C:\server\htdocs\wewe2.php on line 20

   
 
 автор: cheops   (19.04.2005 в 21:29)   письмо автору
 
   для: broker   (19.04.2005 в 18:12)
 

Я что-то не уверен, что можно функции preg_replace_callback передавать метод класса и имеет ли она к нему доступ и вообще правильно ли интерпретирует эту строку, может для этого создать всё-таки внешнюю функцию?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования