Miracle

Рейтинг
376
Регистрация
20.08.2004
edogs:
ббкоды

очень много записей надо будет корвертировать.

да и не нравится мне идея для каждогопользователя парсить в хтмл. проще при редактировании делать обратную замену.

скажем так, я сделал то что мне надо, но ради интереса, как говориться, хотел бы поссмотреть как это делается на регулярками. если вдруг у вас будет время и получиться, буду рад понять как должно быть правильно. честно сказать я не думал что это уж такое сложное задание ))

<?php

//include_once "functions.inc.php";

function spoiler($spoiler)
{
$regex = '#\[spoiler]((?:[^[]|\[(?!/?spoiler])|(?R))+)\[/spoiler]#';

if (is_array($spoiler)) {
$spoiler = '<div class="splr-h">Спойлер: показать</div><div class="splr-b">'.$spoiler[1].'</div>';
}

return preg_replace_callback($regex, 'spoiler', $spoiler);
}

function spoiler_reverce($spoiler)
{
$spoiler = str_replace('<div class=splrh>Спойлер: показать</div>', '', $spoiler);
$regex = '#<div class="splr\-b">((?:[^<]|<\/div>|(?R))+)<\/div>#';

//$regex = '#<div class="splr\-h">Спойлер: показать<\/div><div class="splr\-b">((?:[^<]|<(?!\/div>)|(?R))+)<\/div>#';

if (is_array($spoiler)) {
$spoiler = '[ssspoiler]'.$spoiler[1].'[/ssspoiler]';
}

return preg_replace_callback($regex, 'spoiler', $spoiler);
}

function parse_bb2html($text, $xhtml = false)
{
$tags = array(
'#\[b\](.*?)\[/b\]#si' => ($xhtml ? '<strong>\\1</strong>' : '<b>\\1</b>'),
'#\[i\](.*?)\[/i\]#si' => ($xhtml ? '<em>\\1</em>' : '<i>\\1</i>'),
'#\[u\](.*?)\[/u\]#si' => ($xhtml ? '<span style="text-decoration: underline;">\\1</span>' : '<u>\\1</u>'),
'#\[del\](.*?)\[/del\]#si' => '<del>\\1</del>',
'#\[img\](.*?)\[/img\]#si' => ($xhtml ? '<img src="\\1" />' : '<img src="\\1" >'),
'#\[youtube\](.*?)\[/youtube\]#si' => '<p><iframe width="640" height="480" src="//www.youtube.com/embed/$1?rel=0" frameborder="0" allowfullscreen></iframe></p>',
//'#\[spoiler\](.*?)\[/spoiler\]#si' => '<div class="splr-h">Спойлер: показать</div><div class="splr-b">$1</div>',
);

$text = spoiler($text);

foreach ($tags AS $search => $replace)
{
$text = preg_replace($search, $replace, $text);
}



return $text;
}

$text = "
это спойлер
[spoiler]а тут спойлер1 в*спойлере[spoiler]текст в*спойлере[/spoiler]и снова текст[/spoiler]
смайлик [язык] и*еще [смущаюсь]
[spoiler]а тут спойлер2 в*спойлере[spoiler]текст в*спойлере[/spoiler][/spoiler] asdf
asdasdfa
[spoiler]а тут спойлер3 в*спойлере[spoiler]текст [spoiler]текст в*спойлере[/spoiler]в*спойлере[/spoiler][/spoiler] asdf
";

echo "ogirig";
echo $text . "\n\r\n\r\n\r<hr>";
$text = parse_bb2html($text);
echo "bb2html";
echo $text . "\n\r\n\r\n\r<hr>";
echo "html2bb";
echo $text2 = spoiler_reverce($text);

exit;


?>


---------- Добавлено 30.11.2015 в 19:47 ----------

edogs:
Не уловили что именно не работает, но если важно разобраться - приведите код "как есть" и укажите на конкретную проблему.

не раотает обратное преобразование html2bb , конкретно для спойлера.

не смотря на то что сама регулярка https://regex101.com/r/dS7nT0/5 работает.

По поводу скобки не знал, спасибо.

По п3. Идея не плохая, и устраняет ту проблему о которой вы писали, и благодаря ей, я решил обратную проблему сначала в упрощенном варианте https://regex101.com/r/dS7nT0/5 а потом и в полном https://regex101.com/r/dS7nT0/6. А проблема то была в <(?!div>, хотя если честно то я просто ошибся, но оно работает, правда логика теперь стала не понятна. Ведь должно искать закрывающийся тег... Но ведь работает. ) ,по крайней мере на сайте!

---------- Добавлено 30.11.2015 в 08:42 ----------

edogs:
В "обратном" варианте и отличий больше и открывающий тэг содержит в себе часть закрывающего.

Подумал если рассматривать открывающися эл-т как цельную единицу, то не вижу проблемы описанной вами, но, может и ошибаюсь.! ))

---------- Добавлено 30.11.2015 в 10:25 ----------

к сожалению с preg_replace_callback не работает... странно конечно.

я думаю мне проще будет задать вопросы того чего я действительно не понимаю )

за ответ выше конечно спасибо.

итак

https://regex101.com/r/oG3lT9/1

1. что я не понимаю.

почему одни скобки экранируются [ а вторые нет ]?

2. я понимаю что такое ?: как | и даже немного ?!, но я не понимаю но я все же не понимаю логики данного разбора. Начало и конец- понятно, вырезали. (?R) как бы смыл тоже понятен, хотя не поняно почему стоит именно там, но вот смысл любой символ не скобка* или [ Негативный просмотр вперёд (с отрицанием) (это зачем тут?) /? - те как открытый так и закрытый тег. spoiler] - тоже понятно.

3. делаю обратную функцию https://regex101.com/r/dS7nT0/1 что-то не работает. подскажите где лажанул?

может несколько сумбурно, но я учусь ))

спасибо

спасибо ответившим, едогс снова рад вас видеть.

урл исправил, был не прав, очипятка

рекурсивное решение на самом деле есть, но, почему-то мне не нравится, уж больно запутанное


$input = "верх
глубже
еще глубже
глубже
верх";

function parseTagsRecursive($input)
{

$regex = '#\
((?:[^[]|\[(?!/?indent])|(?R))+)\
#';

if (is_array($input)) {
$input = '<div style="margin-left: 10px">'.$input[1].'</div>';
}

return preg_replace_callback($regex, 'parseTagsRecursive', $input);
}

$output = parseTagsRecursive($input);

echo $output;

вот от сюда http://php.ru/manual/function.preg-replace-callback.html

думал тут предложат изящнее решение.

тогда прошу вашей помощи понять вот это регулярное выражение

#\
((?:[^[]|\[(?!/?indent])|(?R))+)\
#


---------- Добавлено 29.11.2015 в 22:06 ----------

не могу вставить регулярное выражение, не думал что с этим будет проблема здесь на форуме

---------- Добавлено 29.11.2015 в 22:09 ----------

siv1987:
рекурсивные выражения. разбор html и ббкодов.

может я не так ищу, но ничего не нашел.

siv1987:
1. Запретить вложенность ббкодов.
2. Написать рекурсивное регулярное выражение.
3. Выполнить циклическую замену. Проходите один раз текст, проходите второй до тех пор пока не найдутся совпадения.

ну тогда вы забыли и как минимум 4 вариант, тупо менять

[spoiler] -> <div class="spoiler-header">Спойлер: показать</div><div class="spoiler-block">

а

[/spoiler] -> </div>

по пунктам.

1. не актуально.

2. думаю на этот вопрос я и хотел бы получить ответ

3. этот совет из серии побольше гемора. во первых точно такое же регулярное выражение надо будет для правильного обхода

дело в том что я с ними и не работаю. просто хотел забрать свои деньги.

ой. а скажите. у вас в банерах люксадв.ком , торсы теток тизеры, это дешевая реклама.

те если я создал новый блок нужно отключать эту рекламу?

ув. модератры. вопросы по клиганику у меня все же остались, так как нет полного и четкого пониания, цена за 1000 показов тоже не такая как было заявлено, но, наверное лохотрон, в названии темы лишний. уберите пожалуйста. показы откручивают - деньги выплачивают, в теме отвечают. наверное не подходящее слово было мной использовано, не хочу плодить несправедливость.

спасибо.

Где так удаляют*?Было бы замечательно, а то мой сайт взяли перевели на дргой язык, причем машинным переводчиком, а яндекса все устраивает ))), говорит в таких вопросах он не разбирается...

Всего: 3947