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

Форум PHP

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

 

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

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

тема: Какой вариант форматирования текста будет быстрее
 
 автор: Sturmvogel   (04.12.2011 в 23:33)   письмо автору
 
 

Суть задачи: необходимо одни теги заменить другими.

Теперь, собственно, вопрос: что будет выполнено быстрее:

1. парсинг по всей базе замен текста (база замен — это массив, какой тег заменить на какой)
2. сначала смотреть, какие теги есть в тексте, которые нужно заменить, а затем парсить уже только встречающиеся замени, а не идти по всей базе.

* замена с помощью функции preg_replace();
* база замен — что-то типа $tags = array(что => чем);

  Ответить  
 
 автор: Sfinks   (05.12.2011 в 00:06)   письмо автору
 
   для: Sturmvogel   (04.12.2011 в 23:33)
 

Если массив вида array(что => чем), то лучше функцией
$string = strtr($string,$array);

Но она работает только с фиксированными строками, а если необходимо для замены использовать именно РВ, то лучше переформировать массив пар замен в 2 массива $from и $to и передавать в preg_replace() сразу два массива и весь текст:
$string = preg_replace($from,$to,$string);
а не перебирать ваш массив пар в цикле. В цикле точно будет дольше.

Кроме того, функции работы с РВ медленнее чем строковые функции. Поэтому, если возможно, лучше эти 2 массива каждый разделить на еще 2: строковые и с РВ и произвести замену двумя вызовами:
$str = str_replace($str_from_array,$str_to_array,$str);
$str = preg_replace($reg_from_array,$reg_to_array,$str);

  Ответить  
 
 автор: Sturmvogel   (05.12.2011 в 00:25)   письмо автору
 
   для: Sfinks   (05.12.2011 в 00:06)
 

Сейчас у меня делается так:

var $tags = array(    '//???//'            => '<i>$1</i>',
                    '==???=='            => '<h1>$1</h1>');

public function toHtml($Text)
{
    foreach ($this->tags as $from => $to)
    {
        $from = $this->prepare($from);
        $from = str_replace('???', '([\pL!?\.,\s]+)', $from);
        
        
        $from = '/'.$from.'/iu';
        $Text = preg_replace($from, $to, $Text);
    }
    return $Text;
}


а если будут передаваться массивы, функция будет сопоставлять индексы массивов FROM и TO?

  Ответить  
 
 автор: Sfinks   (05.12.2011 в 01:19)   письмо автору
 
   для: Sturmvogel   (05.12.2011 в 00:25)
 

А что с выражениями //???// и ==???== делает функция prepare($from); ?
И еще вопрос.... У вас массив $tags состоит из 1000 элементов? Если да, то о скорости говорить сложно. Если нет, то лучше привести исходный массив к конечному виду и избавиться от лишних преобразований!

  Ответить  
 
 автор: Sturmvogel   (05.12.2011 в 01:34)   письмо автору
 
   для: Sfinks   (05.12.2011 в 01:19)
 

в методе prepare просто данные из массива фильтруются для того, чтобы валидно существовать в рамках РВ. Например, экранируются /.

о размере массива точно сказать не могу, но пока около 50 элементов будет

  Ответить  
 
 автор: Sfinks   (05.12.2011 в 02:27)   письмо автору
 
   для: Sturmvogel   (05.12.2011 в 01:34)
 

Тогда ваш конкретный пример можно свести к следующему:
<?
  $search 
= array(
        
'#//([\pL!?\.,\s]+)//#iu',
        
'#==([\pL!?\.,\s]+)==#iu',
  );
  
$replace = array(
        
'<i>$1</i>',
        
'<h1>$1</h1>',
  );
  
$text preg_replace($search,$replace,$text);
?>

P.S. Я не вдавался в суть РВ, а просто выполнил внутренние преобразования.
P.P.S. Я не работаю с ООП, поэтому просто привел фрагментом кода. Думаю суть ясна.

  Ответить  
 
 автор: Sturmvogel   (05.12.2011 в 13:59)   письмо автору
 
   для: Sfinks   (05.12.2011 в 02:27)
 

спасибо за советы, буду пробовать.

преобразования я делал для простоты и наглядности ввода регулярных выражений

  Ответить  
Rambler's Top100
вверх

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