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