Заменить последний класс на php - PullRequest
1 голос
/ 26 июня 2011
$list = '<ul>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
</ul>';

Как заменить класс последнего <li> с 'woman' на 'man'?

Мы должны наконец получить:

$list = '<ul>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="man">photo</li>
</ul>';

Ответы [ 4 ]

3 голосов
/ 26 июня 2011

С регулярным выражением (которое по умолчанию является жадным) это довольно просто:

$list = preg_replace ('#^(.*class=")woman(".*)$#s', '$1man$2', $list);

Это не будет учитывать, что класс может быть чем-то отличным от тега LI или еслипоследний тег LI не имеет класса.Чтобы исправить первое, вы можете просто изменить регулярное выражение:

$list = preg_replace ('#^(.*<li class=")woman(".*)$#s', '$1man$2', $list);

Чтобы исправить последнее:

$list = preg_replace ('#^(.*)<li[^>]*>(.*)$#s', '$1<li class="man">$2', $list);
2 голосов
/ 26 июня 2011

Два варианта:

  1. Используйте регулярные выражения и сформулируйте регулярное выражение в соответствии с вашими потребностями. Например. замените атрибут класса последних блоков li другим значением.

    $list = preg_replace('#^(.*<li class=")(.*)(">.*</li>.*)$#s', '$1man$3', $list);

  2. Создайте DOM-дерево из фрагмента и используйте xpath для адресации последнего элемента li. ( DOM - документация

1 голос
/ 26 июня 2011

Не удалось найти подходящий дубликат, поэтому вот решение DOM:

$list = '<ul>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
<li class="woman">photo</li>
</ul>';

$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->loadXml($list);
$dom->documentElement->lastChild->setAttribute('class', 'man');
$dom->formatOutput = true;
echo $dom->saveXml($dom->documentElement);

http://codepad.org/6MVEytcp

Если ваша разметка не совместима с XML или если она представляет собой полную HTML-страницу, рассмотрите возможность использования loadHTML для использования модуля синтаксического анализатора HTML libxml. В этом случае ищите по StackOverflow или по моим ответам. Есть много примеров.

1 голос
/ 26 июня 2011

Попробуйте:

$off = strripos ( $list , "class=");
$list = substr_replace ( $list , "man" , $off+7, 5);

Я думаю, что это, безусловно, самый простой способ выполнить трюк, и никакого регулярного выражения вообще не требуется!

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