Вопрос по регулярному выражению

12
M
На сайте с 20.08.2004
Offline
376
#11

<?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 работает.

отец сыночка, лапочки дочки и еще одного сыночка
[Удален]
#12

Совет - перестаньте парсить html регулярками, а используйте предназначенные для этого инструменты. На php особо не пишу, но и для него есть что-то вроде: phpQuery и пр. либы.

edogs software
На сайте с 15.12.2005
Offline
775
#13
Miracle:
не раотает обратное преобразование html2bb , конкретно для спойлера.
не смотря на то что сама регулярка https://regex101.com/r/dS7nT0/5 работает.

А на фига Вам html2bb вообще? Это конечно альтернативный совет, но сохраняйте просто исходник в ббкодах если уж Вам так ббкоды нужны. Тем более как правило обратное преобразование редко однозначно выполнить можно, обязательно какая-нибудь ерунда примешивается.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
M
На сайте с 20.08.2004
Offline
376
#14
edogs:
ббкоды

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

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

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

J
На сайте с 20.02.2014
Offline
120
jkm
#15

Например такой вариант https://regex101.com/r/dS7nT0/7


function spoiler_reverce($spoiler)
{
$regex = '
~
<div\ class="splr-h">[^<]+</div>\s*
(?=<div\ class="splr-b">)
(
<div[^>]*>
(
(?: [^<]+ | <(?!/?div) | (?1) )++
)
</div>
)
~x';

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

return preg_replace_callback($regex, 'spoiler_reverce', $spoiler);
}
M
На сайте с 20.08.2004
Offline
376
#16
jkm:
Например такой вариант https://regex101.com/r/dS7nT0/7

function spoiler_reverce($spoiler)
{
$regex = '
~
<div\ class="splr-h">[^<]+</div>\s*
(?=<div\ class="splr-b">)
(
<div[^>]*>
(
(?: [^<]+ | <(?!/?div) | (?1) )++
)
</div>
)
~x';

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

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

спасибо. работает. еще и удобно записали.

теперь осталось только во все это въехать.

M
На сайте с 20.08.2004
Offline
376
#17

почитал на ночь вики по регулярным выражениям- пол ночи делил какие-то движущиеся шары и палки, причем мучительно ...

не читайте на ночь ))

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий