【问题标题】:Remove unnecessary close tags using regex使用正则表达式删除不必要的关闭标签
【发布时间】:2014-06-24 12:19:05
【问题描述】:

我正在寻找一个正则表达式,它会删除关闭标签和所有内容,直到找到一个打开标签。例如:

</xy>..</zz>..<a>... -> <a>...

</b>..</cc>..<a href="#">...</a> -> <a href="#">...</a>

我试过了,但由于某种原因不起作用:

$html = preg_replace("/^.*<.*>/","<.*>",$html);

【问题讨论】:

    标签: php regex preg-replace


    【解决方案1】:

    下面的正则表达式将捕获开始标记之前的所有文本并将其存储到一个组中(group1),它还将捕获剩余的字符串并将其存储到另一个组中。所以第二组包含开始标签中的文本。

    (.*)(<\w.*)
    

    DEMO

    你的 php 代码是,

    <?php
    $re = '~(.*)(<\w.*)~'; 
    $str= '</b>..</cc>..<a href="#">...</a> -> <a href="#">...</a>';
    $replacement = "$2";
    echo preg_replace($re, $replacement, $str);
    ?> //=>  <a href="#">...</a>
    

    <?php
    $re = '~(?:.*)(<\w.*)~'; 
    $str= '</p>\n<p>Â </p>';
    $replacement = "$1";
    echo preg_replace($re, $replacement, $str);
    ?>
    

    说明:

    • (.*)(&lt;\w.*) 从字符串的开头捕获并在找到&lt; 后跟\w 字字符时停止捕获。 &lt;\w 之前的字符串存储在 group 1 中,&lt;\w 之后的字符串存储在 group2 中(包括&lt;\w)。

    【讨论】:

    • 请使用这个字符串,加上这种类型的引号:“&lt;/p&gt;\n&lt;p&gt;Â &lt;/p&gt;
    • \n 是否表示换行符?
    • 抱歉使用前瞻 (?:.*)(?=(&lt;\w.*))
    • 它留下不包含&lt;\w的行
    • 很难预测您要匹配的内容。
    【解决方案2】:

    如果我正确理解您对 Avinash Raj 的回答的回答,您需要匹配任意数量的输入行直到第一个打开标记的内容,但只匹配一次,以便保留所有后续内容。

    .*(\n.*?)*?(<\w.*(\n.*)*)
    

    第一部分

    .*(\n.*?)*?
    

    匹配任意数量的行,但不是贪婪地匹配(因此是 ?s),所以它会停在包含打开标签的第一行:

    <\w
    

    这之后又是任意行数:

    .*(\n.*)*
    

    所以要提取你想要替换的东西

    .*(\n.*?)*?(<\w.*(\n.*)*)
    

    \2
    

    这是从第一个打开标签开始的所有内容。

    【讨论】:

      猜你喜欢
      • 2011-11-03
      • 2014-04-11
      • 2017-06-19
      • 2019-11-25
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 2010-10-21
      • 1970-01-01
      相关资源
      最近更新 更多