Вернуться   Форум SAPE.RU > Общие вопросы > Разработка и сопровождение сайтов

-->
Ответ
 
Опции темы
Старый 14.04.2009, 15:45   #1
Специалист
 
Аватар для Geser
 
Регистрация: 18.07.2007
Адрес: самый большой колхоз в мире
Сообщений: 158
Вес репутации: 208
Geser на пути к лучшему
Отправить сообщение для Geser с помощью ICQ
По умолчанию замещение регулярного выражения - альтернатива

CMS Seditio, функция sed_bbcode. Там есть несколько циклов
Код:
	foreach($bbcodes as $bbcode => $bbcodehtml)
		{ $text = eregi_replace($bbcode,$bbcodehtml,$text); }
Которые грузят любой сервак, что шаред,что впс. 5-10 одновременных посетителей - и все падает. Есть ли какая-нибудь замена этой функции?
Попробовал поставить str_replace - побила img и некоторые другие(самописные?) коды.
Вот полный код функции:
Код:
function sed_bbcode($text)
	{
	global $L, $skin, $sys, $cfg, $sed_groups;

	$text = sed_bbcode_autourls($text);
	$text = " ".$text;

	$bbcodes = array(
	'$' => '$',
	'' => '<strong>',
	'' => '</strong>',
	'[p]' => '<p>',
	'[/p]' => '</p>',
	'' => '<u>',
	'' => '</u>',
	'' => '<em>',
	'' => '</em>',
	'[hr]' => '<hr />',
	'[_]' => '&nbsp;',
	'[__]' => '&nbsp; &nbsp; &nbsp;',
	'
  • ' => '<ul type="square">', '
' => '</ul>', '[li]' => '<li>',/* EN*/ '[/listol]' => '</ol>',/* EN*/ '[red]' => '<span style="color:#F93737">', '[/red]' => '</span>', '[white]' => '<span style="color:#FFFFFF">', '[/white]' => '</span>', '[green]' => '<span style="color:#09DD09">', '[/green]' => '</span>', '[blue]' => '<span style="color:#018BFF">', '[/blue]' => '</span>', '[orange]' => '<span style="color:#FF9900">', '[/orange]' => '</span>', '[yellow]' => '<span style="color:#FFFF00">', '[/yellow]' => '</span>', '[purple]' => '<span style="color:#A22ADA">', '[/purple]' => '</span>', '[black]' => '<span style="color:#000000">', '[/black]' => '</span>', '[grey]' => '<span style="color:#B9B9B9">', '[/grey]' => '</span>', '[pink]' => '<span style="color:#FFC0FF">', '[/pink]' => '</span>', '[sky]' => '<span style="color:#D1F4F9">', '[/sky]' => '</span>', '[sea]' => '<span style="color:#171A97">', '[/sea]' => '</span>', '
Цитата:
' => '<blockquote><em>', /* EN '.$L['bbcodes_quote'].'*/ '
' => '</em></blockquote>', '[bible]' => '<span class="bible_ref">',/* EN*/ '[/bible]' => '</span>', '[br]' => '<br />', '[more]' => '' ); foreach($bbcodes as $bbcode => $bbcodehtml) { $text = str_replace($bbcode,$bbcodehtml,$text); } $bbcodes = array( '\\[img\\]([^\\\'\;\?([]*)\.(jpg|jpeg|gif|png)\\[/img\\]' => '<img src="\\1.\\2" alt="семейная служба" hspace="8" vspace="8" border="2" class="bordr"/>', '\\[img=([^\\\'\;\?([]*)\.(jpg|jpeg|gif|png)\\]([^\\[]*)\.(jpg|jpeg|gif|png)\\[/img\\]' => '<a href="\\1.\\2" rel="thumbnail"><img src="\\3.\\4" alt="семейная служба" border="2" hspace="8" vspace="8" class="bordr"/></a>', '\\[img2\\]([^\\\'\;\?([]*)\.(jpg|jpeg|gif|png)\\[/img\\]' => '<a href="/pics/\\1_.\\2" rel="thumbnail"><img src="/pics/\\1.\\2" alt="семейная служба" hspace="8" vspace="6" class="bordr"/></a>', '\\[img2alt\\]([^\\\'\;\?([]*)\.(jpg|jpeg|gif|png)\\[/img:([^\\\'\;\?([]*)\\]' => '<a href="/pics/\\1_.\\2" rel="thumbnail"><img src="/pics/\\1.\\2" alt="\\3" hspace="8" vspace="6" class="bordr"/></a>', '\\[thumb=([^\\\'\;\?([]*)\.(jpg|jpeg|gif|png)\\]([^\\[]*)\.(jpg|jpeg|gif|png)\\[/thumb\\]' => '<a href="pfs.php?m=view&amp;v=\\3.\\4"><img src="\\1.\\2" alt="семейная служба" /></a>', '\\[pfs]([^\\[]*)\\[/pfs\\]' => '<a href="'.$cfg['pfs_dir'].'\\1"><img src="system/img/admin/pfs.gif" alt="" /> \\1</a>', '\\[t=([^\\\'\;\?([]*)\.(jpg|jpeg|gif|png)\\]([^\\[]*)\.(jpg|jpeg|gif|png)\\[/t\\]' => '<a href="\\3.\\4"><img src="\\1.\\2" alt="" /></a>', '\\[url=([^\\\'\;([]*)\\]([^\\[]*)\\[/url\\]' => '<a href="\\1">\\2</a>', '\\[url\\]([^\\([]*)\\[/url\\]' => '<a href="\\1">\\1</a>', '\\[color=([0-9A-F]{6})\\]([^\\[]*)\\[/color\\]' => '<span style="color:#\\1">\\2</span>', '\\[style=([1-9]{1})\\]([^\\[]*)\\[/style\\]' => '<span class="bbstyle\\1">\\2</span>', '\\[email=([._A-z0-9-]+@[A-z0-9-]+\.[.a-z]+)\\]([^\\[]*)\\[/email\\]' => '<a href="mailto:\\1">\\2</a>', '\\[email\\]([._A-z0-9-]+@[A-z0-9-]+\.[.a-z]+)\\[/email\\]' => '<a href="mailto:\\1">\\1</a>', '\\[user=([0-9]+)\\]([A-z0-9_\. -]+)\\[/user\\]' => '<a href="users.php?m=details&amp;id=\\1">\\2</a>', '\\[page=([0-9]+)\\]([^\\[]*)\\[/page\\]' => '<a href="page.php?id=\\1">\\2</a>', '\\[page\\]([0-9]+)\\[/page\\]' => '<a href="page.php?id=\\1">'.$L['Page'].' #\\1</a>', '\\[group=([0-9]+)\\]([^\\([]*)\\[/group\\]' => '<a href="users.php?g=\\1">\\2</a>', '\\[topic\\]([0-9]+)\\[/topic\\]' => '<a href="forums.php?m=posts&amp;q=\\1">'.$L['Topic'].' #\\1</a>', '\\[post\\]([0-9]+)\\[/post\\]' => '<a href="forums.php?m=posts&amp;p=\\1#\\1">'.$L['Post'].' #\\1</a>', '\\[pm\\]([0-9]+)\\[/pm\\]' => '<a href="pm.php?m=send&amp;to=\\1"><img src="skins/'.$skin.'/img/system/icon-pm.gif" alt=""></a>', '\\[f\\]([a-z][a-z])\\[/f\\]' => '<a href="users.php?f=country_\\1"><img src="system/img/flags/f-\\1.gif" alt="" /></a>', '\\[ac=([^\\[]*)\\]([^\\[]*)\\[/ac\\]' => '<acronym title="\\1">\\2</acronym>', '\\[del\\]([^\\[]*)\\[/del\\]' => '<del>\\1</del>', '\\[quote=([^\\[]*)\\]' => '<strong>\\1</strong><blockquote><em>',/* EN*/ '\\[spoiler\\]' => '<div style="margin:0; margin-top:8px"><div style="margin-bottom:4px"><input type="button" value="'.$L['Show'].'" onClick="if (this.parentNode.parentNode.getElementsByTagName(\'div\')[1].getElementsByTagName(\'div\')[0].style.display != \'\') { this.parentNode.parentNode.getElementsByTagName(\'div\')[1].getElementsByTagName(\'div\')[0].style.display = \'\'; this.innerText = \'\'; this.value = \''.$L['Hide'].'\'; } else { this.parentNode.parentNode.getElementsByTagName(\'div\')[1].getElementsByTagName(\'div\')[0].style.display = \'none\'; this.innerText = \'\'; this.value = \''.$L['Show'].'\'; }"></div><div class="spoiler"><div style="display: none;">', '\\[spoiler=([A-z0-9А-я_\. -]+)\\]' => '<div style="margin:0; margin-top:8px"><div style="margin-bottom:4px"><input type="button" value="'.$L['Show'].':\\1" onClick="if (this.parentNode.parentNode.getElementsByTagName(\'div\')[1].getElementsByTagName(\'div\')[0].style.display != \'\') { this.parentNode.parentNode.getElementsByTagName(\'div\')[1].getElementsByTagName(\'div\')[0].style.display = \'\'; this.innerText = \'\'; this.value = \''.$L['Hide'].':\\1\'; } else { this.parentNode.parentNode.getElementsByTagName(\'div\')[1].getElementsByTagName(\'div\')[0].style.display = \'none\'; this.innerText = \'\'; this.value = \''.$L['Show'].':\\1\'; }"></div><div class="spoiler"><div style="display: none;">', '\\[/spoiler\\]' => '</div></div></div>'); foreach($bbcodes as $bbcode => $bbcodehtml) { $text = eregi_replace($bbcode,$bbcodehtml,$text); } $bbcodes = array( '\\[listol:([^\\[]*):([^\\[]*)\\]' => '<ol style="list-style: \\1 \\2;">',/* EN*/ '\\[boxspeech:([^\\[]*)\\]([^\\[]*)\\[/boxspeech\\:([^\\[]*)\\]' => '<table style="margin: 5px 8px;" align="\\1"><tr><td class="boxspeech_text">\\2</td></tr><tr><td class="boxspeech_name">\\3</td></tr></table>', '\\[boxcall:([^\\[]*):([^\\[]*)\\]([^\\[]*)\\[/boxcall\\]' => '<table align="\\1" style="margin: 5px 8px; width:\\2px;"><tr><td class="boxcall">\\3</td></tr></table>', '\\[boxinfo:([^\\[]*):([^\\[]*)\\]([^\\[]*)\\[/boxinfo\\]' => '<table align="\\1" style="margin: 5px 8px; width:\\2px;"><tr><td class="boxinfo">\\3</td></tr></table>' ); foreach($bbcodes as $bbcode => $bbcodehtml) { $text = eregi_replace($bbcode,$bbcodehtml,$text); } if ($cfg['parser_vid']) { $bbcodes = array( '\\[youtube=([^\\[]*)\\]' => '<object width="425" height="350"> <param name="movie" value="http://www.youtube.com/v/\\1"></param> <embed src="http://www.youtube.com/v/\\1" type="application/x-shockwave-flash" width="425" height="350"></embed> </object>', '\\[googlevideo=([^\\[]*)\\]' => '<embed style="width:425px; height:326px;" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=\\1&hl=en-GB"> </embed>', '\\[metacafe=([^\\[]*)\\]' => '<embed style="width:425px; height:345px;" src="http://www.metacafe.com/fplayer/\\1" width="400" height="345" wmode="transparent" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed>'); foreach($bbcodes as $bbcode => $bbcodehtml) { $text = eregi_replace($bbcode,$bbcodehtml,$text); } } $bbcodes = array( '\\[colleft\\]([^\\[]*)\\[/colleft\\]' => '<div class="colleft">\\1</div>', '\\[colright\\]([^\\[]*)\\[/colright\\]' => '<div class="colright">\\1</div>', '\\[center\\]([^\\[]*)\\[/center\\]' => '<div style="text-align:center;">\\1</div>', '\\[right\\]([^\\[]*)\\[/right\\]' => '<div style="text-align:right;">\\1</div>', '\\[left\\]([^\\[]*)\\[/left\\]' => '<div style="text-align:left;">\\1</div>', '\\[c1\\:([^\\[]*)\\]([^\\[]*)\\[c2\\:([^\\[]*)\\]([^\\[]*)\\[c3\\]' => '<table style="margin:0; vertical-align:top; width:100%;"><tr><td style="padding:8px; vertical-align:top; width:\\1%;">\\2</td><td style="padding:8px; vertical-align:top; width:\\3%;">\\4</td></tr></table>' ); foreach($bbcodes as $bbcode => $bbcodehtml) { $text = eregi_replace($bbcode,$bbcodehtml,$text); } return(substr($text,1)); }
Как-то оно криво пошло.
Geser вне форума   Ответить с цитированием
Старый 14.04.2009, 16:22   #2
Мне повезёт!
 
Аватар для Alexey
 
Регистрация: 05.05.2007
Сообщений: 1,076
Вес репутации: 276
Alexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущее
По умолчанию

Делайте preg_replace, синтаксис у них очень близок, а производительность в разы выше. Об этом аже в официальном мануале написано.

Добавлено через 2 минуты
Точней в мануале написано мол preg_replace немного лучше
Цитата:
preg_replace(), which uses a Perl-compatible regular expression syntax, is often a faster alternative to ereg_replace().
Но на парактиче я это тестировал - разница в разы.
обычно рега из eregi преобразуется в "/...старое рег выражение/i" - где свич i в конце показывает регисьронезависимый поиск.
__________________
Everything will be great in the end.
If it's not great, it's not the end.

Последний раз редактировалось Alexey; 14.04.2009 в 16:22. Причина: Добавлено сообщение
Alexey вне форума   Ответить с цитированием
Старый 14.04.2009, 16:59   #3
Специалист
 
Аватар для Geser
 
Регистрация: 18.07.2007
Адрес: самый большой колхоз в мире
Сообщений: 158
Вес репутации: 208
Geser на пути к лучшему
Отправить сообщение для Geser с помощью ICQ
По умолчанию

Цитата:
обычно рега из eregi преобразуется в "/...старое рег выражение/i"
Есть стандартная функция?
Geser вне форума   Ответить с цитированием
Старый 14.04.2009, 17:17   #4
Мне повезёт!
 
Аватар для Alexey
 
Регистрация: 05.05.2007
Сообщений: 1,076
Вес репутации: 276
Alexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущее
По умолчанию

preg_replace - ?более чем стандартная функция.

Придется заменить eregi_replace($bbcode,$bbcodehtml,$text); на чтонибудь в роде
preg_replace("/".$bbcode."/i",$bbcodehtml,$text);

См документацию
__________________
Everything will be great in the end.
If it's not great, it's not the end.
Alexey вне форума   Ответить с цитированием
Старый 14.04.2009, 17:32   #5
Специалист
 
Аватар для Geser
 
Регистрация: 18.07.2007
Адрес: самый большой колхоз в мире
Сообщений: 158
Вес репутации: 208
Geser на пути к лучшему
Отправить сообщение для Geser с помощью ICQ
По умолчанию

Не, я имею ввиду преобразовать регулярки из PCRE в POSIX, прежде чем использовать preg_replace/ Либо правильно заэскейпить bbcode
Geser вне форума   Ответить с цитированием
Старый 14.04.2009, 17:43   #6
Мне повезёт!
 
Аватар для Alexey
 
Регистрация: 05.05.2007
Сообщений: 1,076
Вес репутации: 276
Alexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущее
По умолчанию

preg_replace использует PCRE. Так что может наоборот?

А преобразовывать... Они очень похожи, пройдитесь по файлику, поправьте различия... Это конечно нудно, но вы же хотели производительность:P
__________________
Everything will be great in the end.
If it's not great, it's not the end.
Alexey вне форума   Ответить с цитированием
Старый 14.04.2009, 18:18   #7
Специалист
 
Аватар для Geser
 
Регистрация: 18.07.2007
Адрес: самый большой колхоз в мире
Сообщений: 158
Вес репутации: 208
Geser на пути к лучшему
Отправить сообщение для Geser с помощью ICQ
По умолчанию

пройтись по файлику,это называется, "мы не ищем легких путей". Это как вместо for написать 20 раз одно и тоже. Это не мой метод.
Geser вне форума   Ответить с цитированием
Старый 14.04.2009, 20:29   #8
Вредина
 
Аватар для Jooz
 
Регистрация: 03.07.2007
Адрес: д.Коноплянка
Сообщений: 3,535
Вес репутации: 432
Jooz - прекрасное будущееJooz - прекрасное будущееJooz - прекрасное будущееJooz - прекрасное будущееJooz - прекрасное будущееJooz - прекрасное будущееJooz - прекрасное будущееJooz - прекрасное будущееJooz - прекрасное будущееJooz - прекрасное будущееJooz - прекрасное будущее
По умолчанию

Не знаю как там с производительностью, но код приведенный выше мудрен как фиг знает чего. Я так понял (глубоко не вникая) это резалка bb. Юзаю ниже приведенную ф-ию на проектах до 80.000 уников в день, и в ус не дую. Написана лет 5 назад с использованием preg_replace, т.е. foreach совсем не нужен. ))

Фрагмен:
Цитата:

function bb($var){

// [b]
$search[] = "#\[b\](.*?)\[/b\]#si";
$replace[] = '<b>$1</b>';

// [i]
$search[] = "#\[i\](.*?)\[/i\]#si";
$replace[] = '<i>$1</i>';

//[u]
$search[] = "#\[u\](.*?)\[/u\]#si";
$replace[] = '<u>$1</u>';

// [s]
$search[] = "#\[s\](.*?)\[/s\]#si";
$replace[] = '<strike>$1</strike>';

//[mail]
$search[] = "#\[mail\](.*?)\[/mail\]#si";
$replace[] = '<noindex><a href=mailto:$1>$1</a></noindex>';
$search[] = "#\[mail=(.*?)\](.*?)\[/mail\]#si";
$replace[] = '<noindex><a href=mailto:$1>$2</a></noindex>';

//[url]
$search[] = "#\[url=([a-z]+://)(.*?)\](.*?)\[/url\]#si";
$replace[] = '<noindex><a href="$1$2" target="_blank" rel=nofollow>$3</a></noindex>';
$search[] = "#\[url\](.*?)\[/url\]#si";
$replace[] = '<noindex><a href="$1" target="_blank" rel=nofollow>$1</a></noindex>';

return( preg_replace( $search, $replace, $var) );

}
Ну и соответственно:

Цитата:
$MyVar = 'Привет [bbcode]мир[/bbcode]';

echo bb($MyVar);
__________________
Чтобы произошло чудо нужно обязательно дунуть. Если не дунуть - чуда не произойдет!
Jooz вне форума   Ответить с цитированием
Старый 14.04.2009, 20:54   #9
Специалист
 
Аватар для Geser
 
Регистрация: 18.07.2007
Адрес: самый большой колхоз в мире
Сообщений: 158
Вес репутации: 208
Geser на пути к лучшему
Отправить сообщение для Geser с помощью ICQ
По умолчанию

Jooz, код мудрен это да. И еще не оптимизирован,как минимум.Функция супер. Но под нее тож надо регулярки(точнее левую часть) мои перевести как-то...
Geser вне форума   Ответить с цитированием
Старый 16.04.2009, 11:43   #10
Специалист
 
Аватар для Geser
 
Регистрация: 18.07.2007
Адрес: самый большой колхоз в мире
Сообщений: 158
Вес репутации: 208
Geser на пути к лучшему
Отправить сообщение для Geser с помощью ICQ
По умолчанию

Пошел другим путем. Регулярки преобразовывать не стал, просто часть из них выкинул. В итоге общая нагрузка упала с 6.8 до 1.2 сек. Мониторил Zend Studio. Но 1.2 сек все равно наверное много.
Geser вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Альтернатива page-navi sergsam1 Вопросы по работе системы 3 21.12.2008 17:23
Аукцион или конкурс на замещение ссылки Dr. Andy Пожелания пользователей системы 6 01.02.2008 12:05


Часовой пояс GMT +3, время: 22:12.