我使用nicEdit在我的CMS中编写RTF数据。问题是它生成如下字符串:
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>
,在结尾添加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;
}
到目前为止我只有步骤1和3。有人可以帮我一步吗?
hello<br /><br /><br /><br /><br />too much space
谢谢!
ps:避免特定情况会更好。示例:“</p><p>
” - 这5个分隔线也应该只转换为一个“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;
}
”
最终解决方案(特别感谢kemp!)
{{1}}
答案 0 :(得分:15)
即使两个<br>
位于不同的行上(即换行符或它们之间有任何空格),这也会有效:
function replace_br($data) {
$data = preg_replace('#(?:<br\s*/?>\s*?){2,}#', '</p><p>', $data);
return "<p>$data</p>";
}
答案 1 :(得分:2)
这种方法可以解决您的问题:
<br>
或<br />
上拆分字符串:您将获得一系列字符串。<p>
。<br>
。</p><p>
。</p>
另一种方法:使用正则表达式
(<br ?/?>){2,}
将匹配2个或更多<br>
。 (有关如何执行此操作,请参阅php.net on 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 :(得分:0)
我认为这应该适用于第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 );