Php Reg表达式是否删除空标记(其中任何一个)?

Php Reg表达式是否删除空标记(其中任何一个)?,php,regex,Php,Regex,我喜欢删除任何空的或包含空格的空html标记 想要得到的东西: $string = "<b>text</b><b><span> </span></b><p> <br/></p><b></b><font size='4'></font>"; $string=“text”; 致: $string=“text=; 您需要多次运行代码,以便仅使

我喜欢删除任何空的或包含空格的空html标记

想要得到的东西:

$string = "<b>text</b><b><span> </span></b><p>  <br/></p><b></b><font size='4'></font>";
$string=“text

”;
致:

$string=“text=;

您需要多次运行代码,以便仅使用正则表达式执行此操作

执行此操作的正则表达式是:

/<(?:(\w+)(?: [^>]*)?`> *<\/$1>)|(?:<\w+(?: [^>]*)?\/>)/g
/]*)?`>*)|(?:]*)?\/>)/g

但例如,在字符串上,您必须至少运行两次。一次它将删除

,第二次将删除剩余的

,您需要多次运行代码,以便仅使用正则表达式执行此操作

function stripEmptyTags ($result)
{
    $regexps = array (
    '~<(\w+)\b[^\>]*>\s*</\\1>~',
    '~<\w+\s*/>~'
    );

    do
    {
        $string = $result;
        $result = preg_replace ($regexps, '', $string);
    }
    while ($result != $string);

    return $result;
}


$string = "<b>text</b><b><span> </span></b><p>  <br/></p><b></b><font size='4'></font>";
echo stripEmptyTags ($string);
执行此操作的正则表达式是:

/<(?:(\w+)(?: [^>]*)?`> *<\/$1>)|(?:<\w+(?: [^>]*)?\/>)/g
/]*)?`>*)|(?:]*)?\/>)/g
但例如,在字符串上,您必须至少运行两次。一次将删除

,第二次将删除剩余的

函数条空标签($result)
function stripEmptyTags ($result)
{
    $regexps = array (
    '~<(\w+)\b[^\>]*>\s*</\\1>~',
    '~<\w+\s*/>~'
    );

    do
    {
        $string = $result;
        $result = preg_replace ($regexps, '', $string);
    }
    while ($result != $string);

    return $result;
}


$string = "<b>text</b><b><span> </span></b><p>  <br/></p><b></b><font size='4'></font>";
echo stripEmptyTags ($string);
{ $regexps=数组( “~]*>\s*~”, '~~' ); 做 { $string=$result; $result=preg_replace($regexps,,$string); } 而($result!=$string); 返回$result; } $string=“text

”; 回音条空标签($string);
功能条清空标签($result)
{
$regexps=数组(
“~]*>\s*~”,
'~~'
);
做
{
$string=$result;
$result=preg_replace($regexps,,$string);
}
而($result!=$string);
返回$result;
}
$string=“text

”; 回音条空标签($string);
以下是一种方法:

这将输出如下内容

<body><b>text</b></body>
文本
XML文档需要一个根元素,因此无法忽略它。不过,您可以
str\u替换它。

如果要有选择地删除特定节点,请调整XPath查询

也看到

    • 以下是一种方法:

      这将输出如下内容

      <body><b>text</b></body>
      
      文本
      
      XML文档需要一个根元素,因此无法忽略它。不过,您可以
      str\u替换它。

      如果要有选择地删除特定节点,请调整XPath查询

      也看到


      关于
      标记或其他有意义的标记呢?关于
      第1行
      第2行
      呢?关于空的
      标记呢?你能更好地描述你的目的吗?试着解释你想做什么,而不是你认为应该怎么做。一般来说,用正则表达式解析html是个坏主意。改用xml解析器lso,我假设它应该是
      $string=“text";,但这可能只是一个输入错误。
      标签或其他有意义的标签呢?第1行如何?空的
      标签怎么样?你能更好地描述你的目的吗?试着解释你想做什么,而不是你认为应该怎么做。一般来说,用正则表达式解析html是个坏主意。使用xml解析器也可以,我假设它应该是
      $string=“text”,但这可能只是一个输入错误。这就可以了。还有1个问题:1)我如何告诉函数应该删除哪些标记,比如我只需要删除:p、a和span标记。经过深思熟虑,我真的认为应该使用DOM方法,而不是更可靠。我将函数的一部分更改为:(但现在根本不起作用)$regexps=array(“~]*>\s*~”,“~~”);与可实现性相关:在我的例子中,我将只对html文档的某些部分中的文本使用您的函数,但我不会对整个html文档使用它。然后我认为这不会是一个大问题。您认为如何?标记枚举版本的问题是您永远不知道这些标记将是什么。对于第一个regexp,使用“~]*>\s*~”。这是do工作。还有1个问题:1)我如何告诉函数应该删除哪些标记,假设我只需要删除:p、a和span标记。经过深思熟虑后,我真的认为你应该使用DOM方法,因为它更可靠。我将函数的一部分改为:(但现在根本不起作用)$regexps=array(“~]*>\s*~”,“~~”);与可实现性相关:在我的例子中,我将只对html文档的某些部分中的文本使用您的函数,但我不会对整个html文档使用它。然后我认为这不会是一个大问题。您认为如何?标记枚举版本的问题是您永远不知道这些标记将是什么。对于第一个regexp,使用“~]*>\s*~”。