Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:仅删除前几个空<;p>;标签_Php_Regex_Content Management System - Fatal编程技术网

PHP:仅删除前几个空<;p>;标签

PHP:仅删除前几个空<;p>;标签,php,regex,content-management-system,Php,Regex,Content Management System,我有一个自定义开发的CMS,用户可以在其中输入一些内容到富文本字段(ckeditor) 用户只需从另一个文档复制粘贴数据。有时数据的开头有空的标记。以下是数据示例: <p></p> <p></p> <p></p> <p>Data data data data</p> <p>Data data data data</p> <p>Data data data data&

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

用户只需从另一个文档复制粘贴数据。有时数据的开头有空的
标记。以下是数据示例:

<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>

数据数据

数据数据

数据数据

数据数据

数据数据

数据数据

我不想删除所有空的
标记,只删除实际数据之前的标记,在本例中是前3个
标记

我该怎么做

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


是否有一种方法可以将所有
标记收集到一个数组中,然后迭代并删除,直到遇到一个带有数据的标记?

您可以在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,"");
}
document.getElementById(“富文本字段的id”).onkeyup=stripData;
document.getElementById(“富文本字段的id”).onmouseup=stripData;
函数stripData(){
document.getElementById(“富文本字段的id”).value=document.getElementById(“富文本字段的id”).value.replace(/\\\/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;
 }
函数stripData(){
var dataStr=document.getElementById(“富文本字段的id”).value
while(dataStr.match(/^\\/g)){
dataStr=dataStr.replace(/^\\/g,“”);
}
document.getElementById(“富文本字段的id”).value=dataStr;
}

您可以在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,"");
}
document.getElementById(“富文本字段的id”).onkeyup=stripData;
document.getElementById(“富文本字段的id”).onmouseup=stripData;
函数stripData(){
document.getElementById(“富文本字段的id”).value=document.getElementById(“富文本字段的id”).value.replace(/\\\/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;
 }
函数stripData(){
var dataStr=document.getElementById(“富文本字段的id”).value
while(dataStr.match(/^\\/g)){
dataStr=dataStr.replace(/^\\/g,“”);
}
document.getElementById(“富文本字段的id”).value=dataStr;
}

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

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

\s*)+!',''$html);
通常我会建议不要使用正则表达式来解析HTML,但这一个似乎是无害的:

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

\s*)+!',''$html);
使用

$html=preg\u replace(“~^([\s\n]*)*~iUmx”,”,$html);
使用

$html=preg\u replace(“~^([\s\n]*)*~iUmx”,”,$html);

请不要对不规则字符串使用正则表达式:它是。相反,请使用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];
}
function strip\u opening\u行($html){
$dom=新的DOMDocument();
$dom->preserveWhitespace=FALSE;
$dom->loadHTML($html);
$xpath=newdomxpath($dom);
$nodes=$xpath->query(“//p”);
foreach($node作为$node){
//删除不重要的空白。
$trimmed_value=trim($node->nodeValue);
//检查节点是否为空(即

)。 //如果是,请将其从堆栈中移除。 if(空($U值)){ $node->parentNode->removeChild($node); } //如果我们找到了一个非空节点,我们就完成了。 否则{ 打破 } } $parsed_html=$dom->saveHTML(); //保存HTML添加一个DOCTYPE,然后 //标记。由于这是常规数据, //我们可以使用正则表达式。 preg#u match('#(.*)#is',$parsed_html,$matches); 返回$matches[1]; }
所提供的所有正则表达式解决方案都不好的原因:

  • 将空段落元素与属性不匹配(例如

  • 不匹配不是字面上为空的空段落元素(例如


请不要对不规则字符串使用正则表达式:它是。相反,请使用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];
}
function strip\u opening\u行($html){
$dom=新的DOMDocument();
$dom->preserveWhitespace=FALSE;
$dom->loadHTML($html);
$xpath=newdomxpath($dom);
$nodes=$xpath->query(“//p”);
foreach($node作为$node){
//删除不重要的空白。
$trimmed_value=trim($node->nodeValue);
//检查节点是否为空(即

)。 //如果是,请将其从堆栈中移除。 if(空($U值)){ $node->parentNode->removeChild($node); } //如果我们找到了一个非空节点,我们就完成了。 否则{ 打破 } } $parsed_html=$dom->saveHTML(); //保存HTML添加一个DOCTYPE,然后 //标记。由于这是常规数据, //我们可以使用正则表达式。 preg#u match('#(.*)#is',$parsed_html,$matches); 返回$matches[1]; }
所提供的所有正则表达式解决方案都不好的原因:

  • 将空段落元素与属性不匹配(例如

  • 不匹配不是字面上为空的空段落元素(例如


这并不理想。如果禁用javascript,值将不会被剥离,用户也不会知道原因。然后您可以在PHP中使用相同的正则表达式来执行此操作。这似乎将替换所有空的
标记。这不是我想做的。事实上,在这两种情况下,这将击中所有空的

标记。。。不仅仅是前三个。我已经更新了javascript版本,您可以使用将javascript转换为适当的PHP语法&这并不理想。如果