【问题标题】:php: replacing double <br /> with </p><p>php:用 </p><p> 替换双 <br />
【发布时间】:2010-06-02 16:43:28
【问题描述】:

我使用 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. 我需要在字符串的开头/结尾处为&lt;br /&gt; 修剪$data
  2. 将所有包含 2 个或更多 &lt;br/&gt; 的字符串替换为 &lt;/p&gt;&lt;p&gt;(允许使用一个 &lt;br /&gt;)。
  3. 最后,在开头添加&lt;p&gt;,在末尾添加&lt;/p&gt;

到目前为止,我只有第 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&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;too much space”——这 5 条断线也应转换为只有一条“&lt;/p&gt;&lt;p&gt;

最终解决方案(特别感谢 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;
}

【问题讨论】:

    标签: php html string


    【解决方案1】:

    即使两个 &lt;br&gt;s 位于不同的行(即它们之间有换行符或任何空格),这也将起作用:

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

    【讨论】:

    • 你就是男人!呵呵,preg_replace 是最有效的方法。谢谢!我必须更好地学习正则表达式呵呵。

    • 应用“?”时也需要注意在正则表达式中
    • @kemp ...我正面临着这个解决方案的一个小细节。有时在

      旁边有一个
      - 我怎样才能在同一个正则表达式中擦除它们?
    • 编辑为&lt;br &gt;
    • @andufo:我不想在一个正则表达式中放入太多东西,将问题分成两步通常会使事情变得很多更容易
    【解决方案2】:

    这种方法将解决您的问题:

    1. &lt;br&gt;&lt;br /&gt; 上拆分字符串:您将得到一个字符串数组。
    2. 创建一个新字符串&lt;p&gt;
    3. 在数组 1 上循环,从头到尾删除所有为空的条目,直到一个不为空的条目(中断)。
    4. 与 3 相同,但从数组的末尾到开头。
    5. 在数组 1 上循环,有一个整数值 A(默认为 0),它表示有单中断或双中断。
      1. 如果字符串为空,则增加 A 的值并继续循环。
      2. 如果字符串不为空:
        1. 如果 A 的值为 1 或以下,则附加 &lt;br&gt;
        2. 如果 A 的值为 2 或以上,则附加 &lt;/p&gt;&lt;p&gt;
      3. 追加当前条目的内容(不为空)。
      4. 将 A 的值设置为 0。
    6. 追加&lt;/p&gt;

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

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

    将匹配 2 个或更多 &lt;br&gt;。 (有关如何执行此操作,请参阅 php.net on preg_split。)

    现在,第 2 步和第 3 步的方法相同:在数组上循环两次,一次从开始向上 (0..length),一次从结尾向下 (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 个或更多
      的字符串会更好——我正在考虑 preg_replace 但仍然不知道如何继续。
    • 第一种方法也处理这些。第二种方法更容易实现,但问题是你是否喜欢在 HTML 上使用 RegEx(有些人不喜欢这种方法)。
    • 感谢您的模式,但我认为有问题。我正在使用:$data = preg_replace('(
      ){2,}','aaa',$data);它返回空值。为什么? (我使用“aaa”使其在应用后更加明显)
    • 因为你使用preg_replace;你当然可以使用它,但它在我所描绘的情况下不起作用。我还添加了一些代码。
    【解决方案3】:

    我认为这应该适用于第 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 );
    

    【讨论】:

    • 感谢您的想法,但这是基本的。我需要更高级的方法。查看顶部的最终解决方案。
    猜你喜欢
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 2018-02-18
    相关资源
    最近更新 更多