2015-06-26 1 views
2

Я хотел бы сделать тег [code] [/ code] для bbcode так, чтобы то, что было бы внутри, не принималось во внимание в php regex что я сделал.Создание кода [code] [/ code] для BBcode с php regex

Пример:

Hello [b]newbie[/b], to write in bold, use the following : [code][b](YOURTEXT)[/b][/code]

Если вернуться в HTML:

Hello <strong>newbie</strong>, to write in bold, use the following : [b](YOURTEXT)[/b] 

Вот вид части моей BBcode функции:

<? 
function bbcode($var) { 
    $var = preg_replace('`\[b\](.+)\[/b\]`isU', '<strong>$1</strong>', $var); 
    $var = preg_replace('`\[i\](.+)\[/i\]`isU', '<em>$1</em>', $var); 
    $var = preg_replace('`\[u\](.+)\[/u\]`isU', '<u>$1</u>', $var); 
    return $var; 
} 
?> 

Спасибо заранее за вашу любезную помощь!


EDIT: Вот как я, наконец, сделал это работает:

<? 
function bbcode($var) { 
$var2 = preg_split('`(\[code].*?\[/code])`isU', $var, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); 

$var = preg_replace('`\[b\](.+)\[/b\]`isU', '<strong>$1</strong>', $var); 
$var = preg_replace('`\[i\](.+)\[/i\]`isU', '<em>$1</em>', $var); 
$var = preg_replace('`\[u\](.+)\[/u\]`isU', '<u>$1</u>', $var); 

$var = preg_replace('`(\[code].*?\[/code])`isU', $var2[1], $var); 
$var = preg_replace('`\[code\](.+)\[/code\]`isU', '<div>$1</div>', $var); 
return $var; 
} 

$text = 'Hello [b]newbie[/b], to write in bold, use the following [u]lol[/u] : [code][b](YOURTEXT) [u]lol[/u][/b][/code] [b][u]LOL[/u][/b]'; 

echo bbcode($text); 
?> 

ОДНАКО, есть новая проблема, которая возникает: если цепочка символов начинается непосредственно с '[код] для пример

[code][b]hello[/b][/code] test

, чем результат будет:

test test

Это потому, что $ var2 [1] теперь приводит к тому, что происходит после [/ code].

Может кто-нибудь, пожалуйста, помогите мне сделать лучшую делимитацию, которая также будет работать для этой второй цепочки символов? Заранее спасибо !

+0

Я не уверен, что вы хотите сделать ... в любом случае, вы используете жадный регулярное выражение ... Вы должны изменить '(. +) 'к ленивому выражению' (. +?) ' –

+0

Что я хочу сделать, так это то, что bbcode (в примере: [b] (YOURTEXT) [/ b]) внутри тега [code] НЕ ДОЛЖЕН преобразован в (YOURTEXT). Проблема в том, что я не знаю, как сделать preg_replace для [code], который не изменит весь bbcode, который находится внутри этого тега :( – Northwinter

+0

Единственная идея, которую я имел, заключалась в том, чтобы в начале функции сделать что-то, что преобразует '[' в ': beg:' и ']' в ': end:', а затем в нижней части функции повторно преобразует его в '[' и ']'. Но проблема еще раз заключается в том, что я не знаю, не знаю как - ТОЛЬКО - примените это к определенной цепочке каркасов между 2 тегами и игнорируя остальную цепочку каркасов. И, вероятно, лучший способ сделать, но я не знаю, как>< – Northwinter

ответ

1

Наконец, я решить все проблемы, которые я имел с этим:

<? 
function bbcode($var) { 
    $var2 = getStringBetween($var, '[code]', '[/code]'); 

    $var = preg_replace('`\[b\](.+)\[/b\]`isU', '<strong>$1</strong>', $var); 
    $var = preg_replace('`\[i\](.+)\[/i\]`isU', '<em>$1</em>', $var); 
    $var = preg_replace('`\[u\](.+)\[/u\]`isU', '<u>$1</u>', $var); 

    $var = preg_replace('`(\[code].+\[/code])`isU', '<div>'.$var2.'</div>', $var); 
    return $var; 
} 

function getStringBetween($str,$from,$to) 
{ 
    $sub = substr($str, strpos($str,$from)+strlen($from),strlen($str)); 
    return substr($sub,0,strpos($sub,$to)); 
} 

$text = 'Hello [b]newbie[/b], to write in bold, use the following [u]lol[/u] : [code][b](YOURTEXT) [u]lol[/u][/b][/code] [b][u]LOL[/u][/b]'; 

echo bbcode($text); 
?>