php: заменив double <br /> на </ p> <p>

Я использую nicEdit для записи данных RTF в моей CMS. Проблема в том, что он генерирует строки следующим образом:

hello first line<br><br />this is a second line<br />this is a 3rd line 

так как это для новостного сайта, я предпочитаю, чтобы последний html был таким:

 <p>hello first line</p><p>this is a second line<br />this is a 3rd line</p> 

поэтому мое текущее решение таково:

  1. мне нужно обрезать $ data для <br /> в начале / конце строки
  2. замените все строки, которые имеют 2 <br/> или более с </p><p> (разрешен один единственный <br /> ).
  3. наконец, добавьте <p> в начале и </p> в конце

У меня только шаги 1 и 3. может кто-то дать мне руку с шагом 2?

 function replace_br($data) { # step 1 $data = trim($data,'<p>'); $data = trim($data,'</p>'); $data = trim($data,'<br />'); # step 2 ??? // preg_replace() ? # step 3 $data = '<p>'.$data.'</p>'; return $data; } 

благодаря!

ps: было бы лучше избегать конкретных ситуаций. Например: « hello<br /><br /><br /><br /><br />too much space » – эти 5 строк также должны быть преобразованы в один « </p><p>

окончательное решение (особенно спасибо kemp!)

 function sanitize_content($data) { $data = strip_tags($data,'<p>,<br>,<img>,<a>,<strong>,<u>,<em>,<blockquote>,<ol>,<ul>,<li>,<span>'); $data = trim($data,'<p>'); $data = trim($data,'</p>'); $data = trim($data,'<br />'); $data = preg_replace('#(?:<br\s*/?>\s*?){2,}#','</p><p>',$data); $data = '<p>'.$data.'</p>'; return $data; } 

Related of "php: заменив double <br /> на </ p> <p>"

Это будет работать, даже если две строки s находятся на разных строках (т. Е. Между ними есть новая строка или любые пробелы):

 function replace_br($data) { $data = preg_replace('#(?:<br\s*/?>\s*?){2,}#', '</p><p>', $data); return "<p>$data</p>"; } 

Такой подход позволит решить вашу проблему:

  1. Разделите строку на <br> или <br /> : вы получите массив строк.
  2. Создайте новую строку <p> .
  3. Петля на массиве 1, от начала до конца и удалите все записи, которые пусты, до тех пор, пока запись не будет пустой (перерыв).
  4. То же, что и 3, но от конца до начала массива.
  5. Петля на массиве 1, имеет целочисленное значение A (по умолчанию 0), в котором говорится, что существует один или двойной разрыв.
    1. Если строка пуста, увеличьте значение A и продолжите цикл.
    2. Если строка не пустая:
      1. Если значение A равно 1 или ниже, добавьте файл.
      2. Если значение A равно 2 или выше, добавьте </p><p> .
    3. Добавить содержимое текущей записи (которая не пуста).
    4. Установите значение A в 0.
  6. Добавить </p>

Другой подход: использование регулярных выражений

 (<br ?/?>){2,} 

Будет соответствовать 2 или более <br> . (См. Php.net о preg_split о том, как это сделать.)

Теперь тот же подход на шагах 2 и 3: цикл в массиве дважды, один раз с начала (0..length) и один раз с конца вниз (длина-1..0). Если запись пуста, удалите ее из массива. Если запись не пуста, выйдите из цикла.

Сделать это:

 $array = preg_split('/(<br ?/?>\s*){2,}/i', $string); foreach($i = 0; $i < count($array); $i++) { if($value == "") { unset($array[$i]); }else{ break; } } foreach($i = count($array) - 1; $i >= 0; $i--) { if($value == "") { unset($array[$i]); }else{ break; } } $newString = '<p>' . implode($array, '</p><p>') . '</p>'; с $array = preg_split('/(<br ?/?>\s*){2,}/i', $string); foreach($i = 0; $i < count($array); $i++) { if($value == "") { unset($array[$i]); }else{ break; } } foreach($i = count($array) - 1; $i >= 0; $i--) { if($value == "") { unset($array[$i]); }else{ break; } } $newString = '<p>' . implode($array, '</p><p>') . '</p>'; с $array = preg_split('/(<br ?/?>\s*){2,}/i', $string); foreach($i = 0; $i < count($array); $i++) { if($value == "") { unset($array[$i]); }else{ break; } } foreach($i = count($array) - 1; $i >= 0; $i--) { if($value == "") { unset($array[$i]); }else{ break; } } $newString = '<p>' . implode($array, '</p><p>') . '</p>'; 

Я думаю, что это должно работать для шага №2, если я полностью не понимаю ваш сценарий:

 $string = str_replace( '<br><br>', '</p><p>', $string ); $string = str_replace( '<br /><br />', '</p><p>', $string ); $string = str_replace( '<br><br />', '</p><p>', $string ); $string = str_replace( '<br /><br>', '</p><p>', $string );