php:用<p> </p> <p> </p>替换双重

时间:2010-06-02 16:43:28

标签: php html string

我使用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>

所以我目前的解决方案是:

  1. 我需要在字符串的开头/结尾处修剪<br />的$数据
  2. 使用<br/>替换所有包含</p><p>或更多<br />的字符串(允许使用一个<p>)。
  3. 最后,在开始时添加</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; }
  4. 到目前为止我只有步骤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}}

3 个答案:

答案 0 :(得分:15)

即使两个<br>位于不同的行上(即换行符或它们之间有任何空格),这也会有效:

function replace_br($data) {
    $data = preg_replace('#(?:<br\s*/?>\s*?){2,}#', '</p><p>', $data);
    return "<p>$data</p>";
}

答案 1 :(得分:2)

这种方法可以解决您的问题:

  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>

  7. 另一种方法:使用正则表达式

    (<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 );