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