Заменить текст в PHP - PullRequest
       10

Заменить текст в PHP

0 голосов
/ 22 июля 2010

У нас есть переменная с кодом 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 ]

4 голосов
/ 22 июля 2010

Анализ 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);
}

Если вы выводите $ $:

<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 голосов
/ 22 июля 2010

Я выполнил это, разбив текст на массив и выполнив поиск / замену после получения года.

    $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> 
1 голос
/ 22 июля 2010

Я не знаю, почему вы, ребята, так одержимы 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>
0 голосов
/ 22 июля 2010

RegEx:

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

Это действительно зависит от того, что каждый li и якорь каждый раз форматируются одинаково точно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...