|
|
|
| Суть задачи: необходимо одни теги заменить другими.
Теперь, собственно, вопрос: что будет выполнено быстрее:
1. парсинг по всей базе замен текста (база замен — это массив, какой тег заменить на какой)
2. сначала смотреть, какие теги есть в тексте, которые нужно заменить, а затем парсить уже только встречающиеся замени, а не идти по всей базе.
* замена с помощью функции preg_replace();
* база замен — что-то типа $tags = array(что => чем); | |
|
|
|
|
|
|
|
для: 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);
|
| |
|
|
|
|
|
|
|
для: 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? | |
|
|
|
|
|
|
|
для: Sturmvogel
(05.12.2011 в 00:25)
| | А что с выражениями //???// и ==???== делает функция prepare($from); ?
И еще вопрос.... У вас массив $tags состоит из 1000 элементов? Если да, то о скорости говорить сложно. Если нет, то лучше привести исходный массив к конечному виду и избавиться от лишних преобразований! | |
|
|
|
|
|
|
|
для: Sfinks
(05.12.2011 в 01:19)
| | в методе prepare просто данные из массива фильтруются для того, чтобы валидно существовать в рамках РВ. Например, экранируются /.
о размере массива точно сказать не могу, но пока около 50 элементов будет | |
|
|
|
|
|
|
|
для: 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. Я не работаю с ООП, поэтому просто привел фрагментом кода. Думаю суть ясна. | |
|
|
|
|
|
|
|
для: Sfinks
(05.12.2011 в 02:27)
| | спасибо за советы, буду пробовать.
преобразования я делал для простоты и наглядности ввода регулярных выражений | |
|
|
|