php: замена двойного <br /> на </p><p> - PullRequest
9 голосов
/ 02 июня 2010

Я использую 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. мне нужно обрезать данные $ для <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;
}

Ответы [ 3 ]

15 голосов
/ 02 июня 2010

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

function replace_br($data) {
    $data = preg_replace('#(?:<br\s*/?>\s*?){2,}#', '</p><p>', $data);
    return "<p>$data</p>";
}
2 голосов
/ 02 июня 2010

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

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

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

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

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

Теперь, тот же подход на шаге 2 и 3: цикл в массиве дважды, один раз с начала вверх (длина 0 ...) и один раз с конца вниз (длина -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>';
0 голосов
/ 02 июня 2010

Я думаю, что это должно работать для шага # 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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...