Я использую 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>
поэтому мое текущее решение таково:
<br />
в начале / конце строки <br/>
или более с </p><p>
(разрешен один единственный <br />
). <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; }
Это будет работать, даже если две строки s находятся на разных строках (т. Е. Между ними есть новая строка или любые пробелы):
function replace_br($data) { $data = preg_replace('#(?:<br\s*/?>\s*?){2,}#', '</p><p>', $data); return "<p>$data</p>"; }
Такой подход позволит решить вашу проблему:
<br>
или <br />
: вы получите массив строк. <p>
. </p><p>
. </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 );