Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.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 Preg用li替换div,但保持类活动_Php_Html_Pagination_Preg Replace - Fatal编程技术网

Php Preg用li替换div,但保持类活动

Php Preg用li替换div,但保持类活动,php,html,pagination,preg-replace,Php,Html,Pagination,Preg Replace,试图了解如何为将要转换的字符串创建一个PHP preg replace <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 1 等 到

试图了解如何为将要转换的字符串创建一个PHP preg replace

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

  • 1
  • 找出了如何替换元素,而不是如何保持类的活动状态

    $new_pagination = preg_replace('/<div[^>]*>(.*)<\/div>/U', '<li>$1</li>', $old_pagination);
    
    $new\U pagination=preg\U replace('/]*>(.*)/U','
  • $1
  • ',$old\U pagination);

    有什么想法吗?

    试试这个..你也可以用
    stru\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);
    

    这似乎有点过分,但它是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;
    
    或简单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;
    

    这个想法需要一些工作,它会丢弃属性并损坏子节点。@pguardiario OP只想保持活动类;但不确定子节点的损坏是什么意思。。。你的意思是嵌套的
    ?对,只要没有其他属性或多个子节点就可以了。显然,这不是最好的解决方案。@pguardiario XSLT来解救:)好吧,我给它一个A作为奖励:)
    $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();
    
    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;