【问题标题】:Regexp, that deletes all html tag's atrributes, but <a>正则表达式,删除所有 html 标签属性,但 <a>
【发布时间】:2015-05-13 13:26:11
【问题描述】:
$body = preg_replace("/<([a-z][a-z0-9]*)[^>]*?(\/?)>/i",'<$1$2>', $body);

你好。我资助 preg_replace,它可以找到所有 html 标签,并删除它们的属性。我需要从该正则表达式中排除 &lt;a&gt; 标记,所以 f.e.:

<sth a="awdawd"/><a href="http://awdwsrrdg.com"/>

应该改为:

<sth/><a href="http://awdwsrrdg.com />

任何帮助将不胜感激。

【问题讨论】:

    标签: php html regex html-parsing


    【解决方案1】:

    不要使用正则表达式来解析或修改 HTML/XML。这仅适用于少数边缘情况,但不适用于现实世界的应用程序

    改用 DOM 解析器:

    $html = '<sth a="awdawd"/><a href="http://awdwsrrdg.com"/>';
    
    $doc = new DOMDocument();
    $doc->loadHTML($html);
    
    $selector = new DOMXPath($doc);
    
    foreach($selector->query('//@*[not(parent::a)]') as $attr) {
        $attr->parentNode->removeAttribute($attr->nodeName);
    }
    
    echo $doc->saveHTML();
    

    【讨论】:

    • 在您的查询中,name() 指的是属性名称,而不是标签名称。要定位属性的标签(因此父级),您可以使用://@*[not(parent::a)]
    • @CasimiretHippolyte 虽然a 是 HTML 中的常见标签,但 OP 确实意味着名为 a 的属性。 (检查问题)
    • @CasimiretHippolyte 哦,看来我的问题弄错了……是的,在这种情况下可以使用not(parent::a)。谢谢你的提示!
    【解决方案2】:

    众所周知,您不应该使用正则表达式来解析 xhtml(改用 html 解析器),因为引擎在解析奇怪字符时会搞砸事情,除非您真的知道自己设置了什么字符'会面对的。

    另一方面,如果你想使用正则表达式,你可以利用这个正则表达式的丢弃技术:

    <a\b.*?\/>(*SKIP)(*FAIL)|<(\w+).*?>
    

    Working demo

    php代码

    $re = '/<a\b.*?\/>(*SKIP)(*FAIL)|<(\w+).*?>/'; 
    $str = "<sth a=\"awdawd\"/><a href=\"http://awdwsrrdg.com\"/>"; 
    $subst = "<$1 />"; 
    
    $result = preg_replace($re, $subst, $str);
    

    如果你想使用你的正则表达式,你可以在开头添加丢弃模式,像这样:

    <a\b.*?\/>(*SKIP)(*FAIL)|<([a-z][a-z0-9]*)[^>]*?(\/?)>
               ^------^-----Discard pattern flags
    

    【讨论】:

      【解决方案3】:

      试试这个正则表达式:

      /<([b-z][a-z0-9]*)[^>]*?(\/?)>/i
      

      将第一个组规则[a-z] 编辑为[b-z]。现在每个标签,即 start &lt;a 都将被忽略。

      $body = preg_replace("/<([b-z][a-z0-9]*)[^>]*?(\/?)>/i",'<$1$2>', $body);
      

      WORKING DEMO

      $pattern = /&lt;([b-z][a-z0-9]*)[^&gt;]*?(\/?)&gt;/i

      $replacement = &lt;$1$2&gt;

      $text = &lt;sth a="awdawd"/&gt;&lt;a href="http://awdwsrrdg.com"/&gt;

      输出: &lt;sth /&gt;&lt;a href="http://awdwsrrdg.com"/&gt;

      【讨论】:

      • 感谢您的提醒,正则表达式和我的答案已更新,现在看来,它可以正常工作
      • 是的,我想到了这一点,但它忽略了“attr”属性以及其他一些属性。
      猜你喜欢
      • 2013-06-18
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 2011-04-18
      • 2011-07-27
      • 2011-08-27
      • 2011-04-16
      相关资源
      最近更新 更多