Задать вопрос

Как средствами 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
  • Вопрос задан
  • 2983 просмотра
Подписаться 3 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 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
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽