PHP:仅删除前几个空<p>标记</p>

时间:2010-12-09 05:25:32

标签: php regex content-management-system

我有一个自定义开发的CMS,用户可以在其中输入一些内容到富文本字段(ckeditor)。

用户只需从另一个文档中复制粘贴数据即可。有时,数据开头有空<p>个标记。以下是数据样本:

<p></p>
<p></p>
<p></p>
<p>Data data data data</p>
<p>Data data data data</p>
<p>Data data data data</p>
<p>Data data data data</p>
<p></p>
<p></p>
<p>Data data data data</p>
<p>Data data data data</p>
<p></p>

我不想删除所有空的<p>标记,只删除实际数据之前的标记,在这种情况下删除前3个<p>标记。

我该怎么做?

编辑:为了澄清,我需要一个PHP解决方案。 Javascript不会。

有没有办法可以收集数组中的所有<p>个标签,然后迭代并删除,直到遇到数据?

4 个答案:

答案 0 :(得分:3)

通常我建议不要使用正则表达式来解析HTML,但这个似乎无害:

$html = preg_replace('!^(<p></p>\s*)+!', '', $html);

答案 1 :(得分:2)

请不要将正则表达式用于不规则字符串:stirs the sleeping god。相反,使用XPath:

function strip_opening_lines($html) {  
  $dom = new DOMDocument();
  $dom->preserveWhitespace = FALSE;
  $dom->loadHTML($html);

  $xpath = new DOMXPath($dom);
  $nodes = $xpath->query("//p");

  foreach ($nodes as $node) {
    // Remove non-significant whitespace.
    $trimmed_value = trim($node->nodeValue);

    // Check to see if the node is empty (i.e. <p></p>). 
    // If so, remove it from the stack.
    if (empty($trimmed_value)) {
      $node->parentNode->removeChild($node);
    }
    // If we found a non-empty node, we're done. Break out.
    else {
      break;
    }
  }
  $parsed_html = $dom->saveHTML();

  // DOMDocument::saveHTML adds a DOCTYPE, <html>, and <body> 
  // tags to the parsed HTML. Since this is regular data, 
  // we can use regular expressions.
  preg_match('#<body>(.*?)<\/body>#is', $parsed_html, $matches);

  return $matches[1];
}

出现所有正则表达式解决方案的原因很糟糕:

  • 不会将空段落元素与属性(例如<p class="foo"></p>
  • 匹配
  • 不匹配非字面空的空段落元素(例如<p> </p>

答案 2 :(得分:0)

使用

$html = preg_replace ("~^(<p><\/p>[\s\n]*)*~iUmx", "", $html);

答案 3 :(得分:-2)

您可以在javascript中执行此操作,只要执行粘贴操作,使用正则表达式删除不需要的标记,

你的代码就像,

document.getElementById("id of rich text field").onkeyup = stripData; 
document.getElementById("id of rich text field").onmouseup = stripData; 

function stripData(){
    document.getElementById("id of rich text field").value = document.getElementById("id of rich text field").value.replace(/\<p\>\<\/p\>/g,"");
}

编辑:仅删除初始空白

 function stripData(){
        var dataStr = document.getElementById("id of rich text field").value 
        while(dataStr.match(/^\<p\>\<\/p\>/g)) {
           dataStr  = dataStr .replace(/^\<p\>\<\/p\>/g,"");
        }
        document.getElementById("id of rich text field").value = dataStr;
 }