Давненько я не программировал и вот решил опять заняться этим делом. Стоит такая задача - отключить исполнение bb-кодов внутри определённого кода (пусть это будет bb-код [code]).
Подскажите как реализовать это, а то мысли путаются, а рациональное решение так и не приходит в голову.
1. Okula - 25 Июля, 2013 - 19:26:59 - перейти к сообщению
2. Okula - 26 Июля, 2013 - 12:56:57 - перейти к сообщению
Никто идею не подкинет как сделать?
3. EuGen - 26 Июля, 2013 - 13:01:34 - перейти к сообщению
Уверен, в Сети существует множество всевозможных реализаций для замены BB. Ниже приведу результат первой пришедшей в голову идеи:
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- //rgReplace is an array [bbcode=>string] or [bbcode=>[code_string, attr_string]] - so replace [b] -> <b> and [url=something] -> <a href="something">
- function replaceBB($rgReplace, $sData, $sNoBB=null)
- {
- {
- }, $rgReplace);
- $rgNoBB = [];
- {
- return '/\[('.preg_quote($sCode,'/').')\](.*?)\[\/'.preg_quote($sCode,'/').'\]|\[('.preg_quote($sCode,'/').')\s*\=\s*(.*?)\](.*?)\[\/'.preg_quote($sCode,'/').'\]/smi';
- {
- $sData = preg_replace_callback('/\['.$sNoBB.'\](.*?)\[\/'.$sNoBB.'\]/smi', function($rgMatches) use (&$rgNoBB)
- {
- $rgNoBB[] = $rgMatches[1];
- }, $sData);
- }
- $rgPatterns,
- function($rgMatches) use ($rgReplace)
- {
- {
- }));
- {
- return '<'.$rgReplace[$rgMatches[1]][0].' '.$rgReplace[$rgMatches[1]][1].'="'.$rgMatches[2].'">'.$rgMatches[3].'</'.$rgReplace[$rgMatches[1]][0].'>';
- }
- else
- {
- return '<'.$rgReplace[$rgMatches[1]][0].'>'.$rgMatches[$iText].'</'.$rgReplace[$rgMatches[1]][0].'>';
- }
- },
- );
- {
- {
- return $rgNoBB[$rgMatches[1]-1];
- }, $sData);
- }
- return $sData;
- }
Пример
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- 'b'=>'b',
- 'url'=>['a', 'href'],
- ],
- '[b]test code[/b] and [url=localhost]linked [b]new[/b] data[/url] and so on, but not in [nobb]code [b]restriction[/b] container[/nobb]', 'nobb'));
- //string(123) "<b>test code</b> and <a href="localhost">linked <b>new</b> data</a> and so on, but not in code [b]restriction[/b] container"