Как средствами php сделать автоперенос строк только для текста не попадающего в html тэги, или только в разрешенных тэгах?

Делаю блог, использую текст с html кодом. Стандартная функция nl2br никогда не нравилась, она не совсем подходит. Задача сделать автоперенос строк только для текста не попадающего в html тэги, или только в разрешенных тэгах. Делаю следующем образом
$base64 = function ($out) {
                $out[1] = '[base64]'. base64_encode(trim($out[1])) .'[/base64]';
                return trim($out[1]);
            };
            
            $text = preg_replace_callback('|(\<.*\>.*\</.*\>)|Us', $base64, $text);
            
            $text = str_replace("\n\r", "<br />", $text);
            $text = str_replace("\r\n", "<br />", $text);
            
            $baseDecode = function ($out) {return base64_decode($out[1]);};
            $text = preg_replace_callback('|\[base64\](.*)\[/base64\]|U', $baseDecode, $text);

Но всеравно
появляется в ul ol
  • Вопрос задан
  • 2981 просмотр
Решения вопроса 1
@2byte Автор вопроса
Решено
$base64 = function ($out) {
                $out[1] = '[base64]'. base64_encode($out[1]) .'[/base64]';
                return $out[1];
            };
            $text = preg_replace_callback('|(\<.*\>(\s?\n?).*\</.*\>)|U', $base64, $text);
            $text = preg_replace_callback('|(\<.*\>)|U', $base64, $text);
            
            if (strpos($text, '[base64]') !== false) {
                $text = str_replace("[/base64]\r\n", "[/base64]", $text);
            }

            $text = str_replace("\n\r", "<br />", $text);
            $text = preg_replace("|\n|", "$1<br />", $text);
            
            $baseDecode = function ($des) {return base64_decode($des[1]);};
            $text = preg_replace_callback('|\[base64\](.*)\[/base64\]|U', $baseDecode, $text);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@rozhik
;text = preg_replace_callback('|(\<[^\>]\>([^\<]+)\[^\>]\>)|Us', $base64, $text);
Ответ написан
egor_nullptr
@egor_nullptr
Алгоритм примерно такой:
1) Загрузить весь текст в DomDocument
2) При помощи DomXPath найти все теги, в которых не надо менять перевод строки
3) Вырезать эти теги и заменть заглушкой (например <dummy n="1"/>, где n - номер вырезанного тега), вырезанные теги сохранить в отдельный массив
4) Применить nl2br к тексту
5) При помощи DomXPath найти все заглушки и заменить их соответствующими тегами из сохраненного массива
6) Получить готовый текст из DomDocument
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы