очень много записей надо будет корвертировать.
да и не нравится мне идея для каждогопользователя парсить в хтмл. проще при редактировании делать обратную замену.
скажем так, я сделал то что мне надо, но ради интереса, как говориться, хотел бы поссмотреть как это делается на регулярками. если вдруг у вас будет время и получиться, буду рад понять как должно быть правильно. честно сказать я не думал что это уж такое сложное задание ))
<?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] asdfasdasdfa[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; ?>
не раотает обратное преобразование 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 ----------
Подумал если рассматривать открывающися эл-т как цельную единицу, то не вижу проблемы описанной вами, но, может и ошибаюсь.! ))---------- Добавлено 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;
глубже еще глубже глубже
еще глубже
((?:[^[]|\[(?!/?indent])|(?R))+)\
вот от сюда http://php.ru/manual/function.preg-replace-callback.html
думал тут предложат изящнее решение.
тогда прошу вашей помощи понять вот это регулярное выражение
#\((?:[^[]|\[(?!/?indent])|(?R))+)\#
может я не так ищу, но ничего не нашел.
ну тогда вы забыли и как минимум 4 вариант, тупо менять
[spoiler] -> <div class="spoiler-header">Спойлер: показать</div><div class="spoiler-block">
а
[/spoiler] -> </div>
по пунктам.
1. не актуально.
2. думаю на этот вопрос я и хотел бы получить ответ
3. этот совет из серии побольше гемора. во первых точно такое же регулярное выражение надо будет для правильного обхода
дело в том что я с ними и не работаю. просто хотел забрать свои деньги.
ой. а скажите. у вас в банерах люксадв.ком , торсы теток тизеры, это дешевая реклама.
те если я создал новый блок нужно отключать эту рекламу?
ув. модератры. вопросы по клиганику у меня все же остались, так как нет полного и четкого пониания, цена за 1000 показов тоже не такая как было заявлено, но, наверное лохотрон, в названии темы лишний. уберите пожалуйста. показы откручивают - деньги выплачивают, в теме отвечают. наверное не подходящее слово было мной использовано, не хочу плодить несправедливость.
спасибо.
Где так удаляют*?Было бы замечательно, а то мой сайт взяли перевели на дргой язык, причем машинным переводчиком, а яндекса все устраивает ))), говорит в таких вопросах он не разбирается...