|
|
|
|
<?
preg_replace('^\[(b|i|u)\](.*)\[/(b|i|u)\]$', '<$1>$2</$3>', $_POST['msg']);
|
нужно чтото типа такого, я думаю с виду понятно:)
заранее спасибки :] | |
|
|
|
|
|
|
|
для: sl1p
(24.12.2008 в 11:16)
| | #\[(b|i|u)\](.*)\[/(b|i|u)\]#
как-то так получилось но криво..
а как теперь его заставить заменять парные ббкоды? и во всей строке а не только первое попавшееся?) | |
|
|
|
|
|
|
|
для: sl1p
(24.12.2008 в 11:21)
| | Думаю как-то так
<?
echo preg_replace('~\[(b|i|u)\](.*?)\[/\1\]~si', '<$1>$2</$1>', $_POST['msg']);
|
(.*?) будет останавливаться перед первым закрывающим таким-же тегом, а не последним
и без ^$
и ~si можно просто ~s , если не бывает [U]такое[\U], или совсем без модификаторов
, если должно быть тольо одной строкой | |
|
|
|
|
|
|
|
для: xx77
(24.12.2008 в 13:37)
| | пасибки огромное, то что нужно:)
а можно если не трудно объяснить это:
~\[(b|i|u)\](.*?)\[/\1\]~si
|
тут юзается первая переменная прямо в выражении или как?:)
зы. немного косячек:)
[ b][ i][u]kjgfh[/u][/i][/b]
так вот не катит, заменяет только первые, верхние теги, то есть [b][/b]... | |
|
|
|
|
|
|
|
для: sl1p
(24.12.2008 в 18:16)
| | говорят лучше работает ([biu]) вместо (b|i|u) ,)
а \1 , в нём строка, та что совпала в первой подмаске , та-же в $1 строки замены
// upd:
>немного косячек
так и должно быть :)
атоэто работало-бы медленно-медленно
, и даже медленнее чем если-бы была-бы функция preg_replace_recursive() :)
можно было-бы, просто \(/?[biu])\] заменять на <$1>
но для этого нужно было-бы считать сколько открывающих и закрывающих тегов было
ато-бы лишний [b][b][b][b] изковеркал-бы все последующие сообщения
, или проходить той preg_replace несколько раз | |
|
|
|
|
|
|
|
для: xx77
(24.12.2008 в 19:41)
| | хм, ясно:)
[b]тесд[/b]
но вот тут же изменило..только последний повторяющийся тег пропустило:)
[b][i][b].. | |
|
|
|
|
|
|
|
для: sl1p
(25.12.2008 в 07:19)
| | Тут если заглянуть в код форума , который есть открытый код, то можно найти где-то в папке utils
что заменяется как-то так что сначала проходит preg_replace('~\[b\].*?\[/b\] .....
потом preg_replace('~\[i\].*?\[/i\] .....
и так далее. , можн6о сделать массив выражений для preg_replace
.........................................................
// [b]test[/b] :) | |
|
|
|
|
|
|
|
для: xx77
(25.12.2008 в 19:21)
| | ну тогда ок)
просто мне в принципе пог на время обработки,ибо решил сходу пихать в базу изменённое.. так что думаю не трабл..
если не трудно покажите пример замены всей хренотени :) | |
|
|
|
|
|
|
|
для: sl1p
(25.12.2008 в 21:40)
| | Примерно такое получается если просто удалять все лишние закрывающие теги и закрывать все лишние открытые
<pre><?
$text = '
[b ][i ][u ]kjgfh[/u][/i]
[i ][/u]kjgfh[/u][/i][/b]
[u ]kjgfh[/u][/i][/b]
[/b][/i][/u]kjgfh[/u][/i][/b]
[b ]kjgfh[/u][/i][/b]
[b ][i][i][i][i][i][i][i][i][i][u]kjgfh[/u][/b]
[/i][/u]kjgfh[/u][/i]
[u ]kjgfh[/u][/i][/b]
[/b][/i][/u]kjgfh[/u][/i][/b]
[b][b][b][b]';
function partags($mtchs, $bool=false) {
static $b=0, $i=0, $u=0;
if ($bool) {
$mtchs = str_repeat('</b>', $b)
. str_repeat('</i>', $i)
. str_repeat('</u>', $u);
$b = $i = $u = 0;
return $mtchs;
}
if ($mtchs[1] == '/') {
if (isset($$mtchs[2]) && $$mtchs[2] > 0) {
$$mtchs[2] -= 1;
return '</' . $mtchs[2] . '>';
} else return '';
}
else if (isset($$mtchs[2])) {
$$mtchs[2] += 1;
return '<' . $mtchs[2] . '>';
}
return '';
}
echo htmlspecialchars(
$text = preg_replace_callback('~\[(/?)(\w)\]~', 'partags', $text)
. partags('', 1)
// последний вызов функции добывит закрытие всех незакрытых тегов
);
?>
|
можно переделать чтобы теги не удалялись , а просто не преобразовывались
, или чтобы не ограничивать только теми тегами которые объявлены как переменные
$b=0, $i=0, $u=0;, придётся делать массивами.
Но думаю лучше не разрешать пользователям вставлять столько разметки в свои страницы , а сделать проще, как на этом форуме например, не сильно креативным авторам достаточно пары-тройки preg_replace | |
|
|
|
|
|
|
|
для: xx77
(25.12.2008 в 23:11)
| | печально =( | |
|
|
|
|
|
|
|
для: sl1p
(26.12.2008 в 08:01)
| | я вообще у себя когда-то делал попроще
<?
function d_new($match) {
global $tra, $smile, $mnemo;
if (isset($match[1])) return (($as = array_search($match[0], $mnemo)) === false ) ? $match[0]: $smile[$as];
else return ($tra) ? htmlspecialchars(translit($match[0])): htmlspecialchars($match[0]);
}
// здесь массивы $smile, $mnemo это смайлики типа .wink.
// $tra - это включили-ли транслит
$msg = preg_split('#\[cod\](.*?)(?:\[/cod\]|$)#si', $msg, -1, PREG_SPLIT_DELIM_CAPTURE);
// разбивал ничем не обработанный текст на код или не код
$i = 0; $text = '';
while(($tmp = array_shift($msg)) !== NULL)
{
$text .= (($i++)%2) ? "\n" . '<span class="code"><pre>' . htmlspecialchars($tmp) . '</pre></span>' . "\n": preg_replace_callback('#\.([a-z0-9]+\.)|[^\.]+#s', 'd_new', $tmp);
}
// и в цикле заменял смайлы и вставлял код в такой контейнер где добавлялась прокрутка
, если вставляли слишком длинные строки , вместо htmlspecialchars можно вставить подсветку
|
и никаких bb-кодов , ибо я и сам всё уже разукрасил :) | |
|
|
|
|
|
|
|
для: xx77
(26.12.2008 в 14:48)
| | ясненько..
спасибо огромное за помощь =) | |
|
|
|