【问题标题】:Preg replace divs with li but keep class activePreg 用 li 替换 div 但保持类活动
【发布时间】:2014-05-01 07:40:54
【问题描述】:

试图弄清楚如何为将要转换的字符串创建 PHP preg 替换

<div class="active make_link">1</div>
<div class="make_link digit"><a href="">2</a></div>
<div class="make_link digit"><a href="">3</a></div>
etc

<li class="active">1</li>
<li><a href="">2</a></li>
<li><a href="">3</a></li>
etc

弄清楚如何替换元素,但不知道如何保持类处于活动状态。

$new_pagination = preg_replace('/<div[^>]*>(.*)<\/div>/U', '<li>$1</li>', $old_pagination);

有什么想法吗?

【问题讨论】:

    标签: php html pagination preg-replace


    【解决方案1】:

    试试这个..你也可以使用str_ireplace 来做到这一点

    <?php
    $html='<div class="active make_link">1</div>
    <div class="make_link digit"><a href="">2</a></div>
    <div class="make_link digit"><a href="">3</a></div>';
    
    echo str_ireplace(array('<div','</div','class="active make_link"','class="make_link digit"'),array('<li','</li','active',''),$html);
    

    【讨论】:

      【解决方案2】:

      或者简单的html dom:

      require_once('simple_html_dom.php');
      
      $doc = str_get_html($string);
      foreach($doc->find('div') as $div){
        $div->tag = 'li';
        preg_match('/active/', $div->class, $m);
        $div->class = @$m[0];
      }
      
      echo $doc;
      

      【讨论】:

        【解决方案3】:

        这可能看起来有点过分,但它是 XSLT 的一个很好的用例:

        $xslt = <<<XML
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
          <xsl:template match="@*|node()">
            <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
          </xsl:template>
          <xsl:template match="div">
            <li>
              <xsl:if test="@*[name()='class' and contains(., 'active')]">
                <xsl:attribute name="class">active</xsl:attribute>
              </xsl:if>
              <xsl:apply-templates select="node()" />
            </li>
          </xsl:template>
        </xsl:stylesheet>
        XML;
        

        它使用身份规则,然后覆盖&lt;div&gt; 的处理,为具有此类名称的节点添加class="active"

        $xsl = new XSLTProcessor;
        
        $doc = new DOMDocument;
        $doc->loadXML($xslt);
        
        $xsl->importStyleSheet($doc);
        
        $doc = new DOMDocument;
        $html = <<<HTML
        <div class="active make_link">1</div>
        <div class="make_link digit"><a href="">2</a><div>test</div></div>
        <div class="make_link digit"><a href="">3</a></div>
        HTML;
        
        $doc->loadHTML($html);
        
        echo $xsl->transformToDoc($doc)->saveHTML();
        

        【讨论】:

        • 这个想法需要一些工作,它会丢弃属性并破坏子节点。
        • @pguardiario OP 只想保持活跃的课堂;不知道你对子节点的修改是什么意思,虽然......你的意思是嵌套&lt;div&gt;
        • 对,只要没有其他属性或者多于1个子节点就可以了。显然不是最好的解决方案。
        • @pguardiario XSLT 来救援 :)
        • 好吧,我给它一个 A 表示努力 :)
        猜你喜欢
        • 2017-01-05
        • 2012-03-27
        • 1970-01-01
        • 2010-12-02
        • 2012-01-26
        • 2020-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多