Помогите с алгоритмом цитат (regexp)

DavisEstevis

Новичок
Помогите с алгоритмом цитат (regexp)

Прошу помощи в вопросе про регулярные выражения.

Есть такой алгоритм:
PHP:
$number = substr_count($string,"[quote=\"");
if ($number>25) $number=25; 
$pattern = "|\[quote=\"([^\"]+)\"\]([^\[]+)\[/quote\]|is"; 
$replacement = "<table cellpadding=4 cellspacing=0><tr><td><table class=quote_table cellpadding=4 cellspacing=0><tr><td class=quote_td_up> \\1 писал(а): </td></tr><tr><td> \\2 </td></tr></table></td></tr></table>"; 
for($i = 0; $i < $number; $i++) $string = preg_replace($pattern, $replacement, $string);
Работает отлично, но спотыкается, если внутри цитат найдёт знак "[".

На что нужно перестроить $pattern, чтобы работал нормально?
 

WP

^_^
OMG...
PHP:
// кусок из моего парсера bb-кода
$this->result = preg_replace_callback('~(?:<br />\s*)?\[QUOTE(?:=([^\]]*))?\](?:<br />)?(.*?)(?:<br />)?\[/QUOTE\](?:<br />)?~si',create_function('$a','return \'<table border=0 width=100%><tr><td width="10" rowspan=3>&nbsp;</td><td width=90%><hr size=1 noshade></td></tr><tr><td>\'.($a[1] != \'\'?\'<i>Original by: \'.$a[1].\'</i><br />\':\'\').$a[2].\'</td></tr><tr><td><hr size=1 nowhade></td></tr></table>\';'),$this->result);
 

DavisEstevis

Новичок
Спасибо конечно, но я не могу понять надпись на этом языке :)
Не мог бы ты дать мне готовый $pattern для моего алгоритма?
 

DavisEstevis

Новичок
то что я "не понял надпись" я не про OMG речь вёл а как раз про твою регулярку. пожалуйста переделай мне паттерн я тебя попросил об этом именно. я не разберусь в твоей ибо регулярные выражения почти не знаю
 

WP

^_^
Так может стоит бороться с болезнью, а не с симптомом? Выучи регулярки.
 

DavisEstevis

Новичок
господи иисусе, я тебя попросил по человечески сделать конкретную переменную мне а не давать советы. слушай если речь идёт о деньгах, я заплачу. стучи в асю 233-193-717
 

WP

^_^
Деньги брать за такое - грех.
По поводу цикла:
Итерация свойственна человеку, а рекурсия божественна (С) Дональд Кнутт.

PHP:
function BBcode_quote_callback($a) {return '<table border=0 width=100%><tr><td width="10" rowspan=3>&nbsp;</td><td width=90%><hr size=1 noshade></td></tr><tr><td>'.($a[1] != ''?'<i>Original by: '.$a[1].'</i><br />':'').BBcode_quote($a[2]).'</td></tr><tr><td><hr size=1 nowhade></td></tr></table>';}
function BBcode_quote($string) {return preg_replace_callback('~(?:<br />\s*)?\[QUOTE(?:="?([^\]]*)"?)?\](?:<br />)?(.*)(?:<br />)?\[/QUOTE\](?:<br />)?~si','BBcode_quote_callback',$string);}
echo BBcode_quote('сюда текст');
 

DavisEstevis

Новичок
пасиб чувак по асе мне помог. а всё-таки лучший алгоритм в данном случае:

PHP:
$number = substr_count($string,"[quote=\"");
if ($number>25) $number=25; 
$pattern = "|\[quote=\"([^\"]+)\"\](.*?(?!\[quote\]))\[/quote\]|is"; 
$replacement = "<table cellpadding=4 cellspacing=0><tr><td><table class=quote_table cellpadding=4 cellspacing=0><tr><td class=quote_td_up> \\1 писал(а): </td></tr><tr><td> \\2 </td></tr></table></td></tr></table>"; 
for($i = 0; $i < $number; $i++) $string = preg_replace($pattern, $replacement, $string);
 

maxru

МИФИст
1) А BB-код без РегЭкса искать слабо? Немного теряешь в удобстве, много выигрываешь в производительности.
2) "Если можно вместо рекурсии сделать итерацию - делайте итерацию." (С) Никлас Вирт
 

mani13

Новичок
WP
твоё регулярки рулят ни асилило:
PHP:
[quote]text[quote]text2[/quote]text3[/quote]text4[quote]text5[/quote]
 

WP

^_^
mani13
Попросил бы быть точным. Не мои, а того чела. Мои - осилили.
 

valyala

Новичок
Автор оригинала: WP
mani13
Попросил бы быть точным. Не мои, а того чела. Мои - осилили.
WP, сравни результат работы твоих регулярок со следующими:

PHP:
function BBcode_quote_callback($a)
{
    $name = substr($a[1], 1);
    if ($name[0] == '"') {
        $name = substr($name, 1, -1);
    }

    return '<table border=0 width=100%><tr><td width="10" rowspan=3>&nbsp;</td><td width=90%><hr size=1 noshade></td></tr><tr><td>' .
        ($name != '' ? '<i>Original by: ' . $name . '</i><br />' : '') . BBcode_quote($a[2]) . 
        '</td></tr><tr><td><hr size=1 nowhade></td></tr></table>';
}

function BBcode_quote($str)
{
    return preg_replace_callback('~\\[quote(=(?:"[^"]*"|(?!")[^\\]]*))?\\]((?:(?R)|.)*?)\\[/quote]~is', 'BBcode_quote_callback', $str);
}
На тестовой строке:

PHP:
echo BBcode_quote('text0[quote=""]text1[quote="b]cd"]text2[/quote]text3[/quote]text4[quote=cdf]text5[/quote]text6');
 

mani13

Новичок
WP
да, извиняюсь с примером -- упустил, что регулярку надо прогонять n раз.
 

WP

^_^
mani13
:)
Andreika
Ищет сколько в строке тегов [ quote ].
valyala
Идентично.
 
Сверху