用PHP替换文本

时间:2010-07-21 20:25:30

标签: php regex replace

我们有一个带有hmtl代码的变量。

<?php echo $list; ?>

这将提供类似的内容:

<li><a href='http://site.com/2010/' title='2010'>2010</a></li>
<li><a href='http://site.com/2009/' title='2009'>2009</a></li>
<li><a href='http://site.com/2008/' title='2008'>2008</a></li>

想要为每个<li>添加课程,可以从title属性中获取:

<li class="y2010"><a href='http://site.com/2010/' title='2010'>2010</a></li>
<li class="y2009"><a href='http://site.com/2009/' title='2009'>2009</a></li>
<li class="y2008"><a href='http://site.com/2008/' title='2008'>2008</a></li>

我们应该使用变量$list

暂定计划:

  • 在每个中搜索title属性 <li>....</li>
  • 将其值抛给我们添加的用于打开<li>
  • 的类

需要PHP解决方案。

感谢。

4 个答案:

答案 0 :(得分:4)

如果我理解你所面临的问题,解析DOM对我来说听起来有点过分。假设您确定$list变量的整个内容将被构造为<li><a href='foo' title='bar'>bar</a></li>,那么您可以通过将正则表达式与循环相结合来轻松地执行您所要求的内容:

$list = "<li><a href='http://site.com/2010/' title='2010'>2010</a></li>
<li><a href='http://site.com/2009/' title='2009'>2009</a></li>
<li><a href='http://site.com/2008/' title='2008'>2008</a></li>";
preg_match_all("/title='([^']*)'/s",$list,$matches); //this gets all titles
$output=$list;
foreach($matches[1] as $match) { //this applies the titles to the li elements
  $location = strpos($output,"<li>");
  $output = substr($output,0,$location)."<li class='".$match."'>".substr($output,$location+4);
}

如果你回显$ output:

<li class="y2010"><a href='http://site.com/2010/' title='2010'>2010</a></li>
<li class="y2009"><a href='http://site.com/2009/' title='2009'>2009</a></li>
<li class="y2008"><a href='http://site.com/2008/' title='2008'>2008</a></li>

答案 1 :(得分:2)

我通过将文本拆分成数组,并在获得年份后执行搜索/替换来完成此操作。

    $carrReturn="\r\n"; //Set the Newline and Return string to search for
    $arr = explode($carrReturn, $list); //Break the text into an array
    $list=""; //clear $list
    for ($x=0; $x<count($arr); $x++){
            $current=$arr[$x];
            $year= strip_tags($current); //Get the year by stripping the HTML tags.

            $list.=str_replace("<li", "<li class=\"y".$year."\"",$current)."\r\n";      
            //Reconstruct $list
    }

<强>输出

<li class="y2010"><a href='http://site.com/2010/' title='2010'>2010</a></li> 
<li class="y2009"><a href='http://site.com/2009/' title='2009'>2009</a></li> 
<li class="y2008"><a href='http://site.com/2008/' title='2008'>2008</a></li> 

答案 2 :(得分:1)

我不知道为什么你们这么痴迷于Regex。 DOM清晰可读:

$dom = new DOMDocument;
$dom->loadXML("<ul>$list</ul>");
$xPath = new DOMXPath($dom);
foreach($xPath->query('//li/a/@title') as $node) {
    $node->parentNode->parentNode->setAttribute('class', $node->nodeValue);
}
echo $dom->saveXML($dom->documentElement);

输出:

<ul>
<li class="2010"><a href="http://site.com/2010/" title="2010">2010</a></li>
<li class="2009"><a href="http://site.com/2009/" title="2009">2009</a></li>
<li class="2008"><a href="http://site.com/2008/" title="2008">2008</a></li>
</ul>

答案 3 :(得分:0)

正则表达式:

preg_replace("/<li>(<a .+ title=')(\d{4})'/", "<li title='y$2'>$1$2", $string);

这实际上取决于每次li和anchor的格式化方式都是相同的。