php: замена дважды <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>"

конечное решение (особая благодарность грубой шерсти!)

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;
}
9
задан Andres SK 2 June 2010 в 17:56
поделиться

3 ответа

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

function replace_br($data) {
    $data = preg_replace('#(?:<br\s*/?>\s*?){2,}#', '</p><p>', $data);
    return "<p>$data</p>";
}
16
ответ дан 4 December 2019 в 11:40
поделиться

Я думаю, что это должно сработать для шага №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 );
0
ответ дан 4 December 2019 в 11:40
поделиться

Этот подход решит вашу проблему:

  1. Разделите строку на
    или
    : вы получите массив строк.
  2. Создайте новую строку

    .

  3. Выполните цикл по массиву из 1 от начала до конца и удалите все пустые записи до тех пор, пока не появится непустая запись (разрыв).
  4. То же, что и 3, но от конца до начала массива.
  5. Цикл в массиве из 1 имеет целочисленное значение A (по умолчанию 0), которое указывает, что существует одинарный или двойной разрыв.
    1. Если строка пуста, увеличьте значение A и продолжите цикл.
    2. Если строка не пуста:
      1. Если значение A равно 1 или меньше, добавьте
        .
      2. Если значение A равно 2 или больше, добавьте

        .

    3. Добавить содержимое текущей записи (которая не пуста).
    4. Установите значение A равным 0.
  6. Добавить


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

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

будет соответствовать 2 или более
. (См. 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>';
2
ответ дан 4 December 2019 в 11:40
поделиться
Другие вопросы по тегам:

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