替换字符串</p>中最后一次出现的<p>标记

时间:2014-03-23 02:55:04

标签: php regex preg-replace

我希望替换字符串中最后一次出现的P标记。

$bodytext = preg_replace(strrev("/<p>/"),strrev('<p class="last">'),strrev($bodytext),1);
$bodytext = strrev($bodytext);

这有效,但可以不使用strrev吗?有正则表达式解决方案吗?

类似的东西:

$bodytext = preg_replace('/<p>.?$/', '<p class="last">', $bodytext);

非常感谢任何帮助。

我的缩短版本:

$dom = new DOMDocument();
$dom->loadHTML($bodytext);
$paragraphs = $dom->getElementsByTagName('p');
$last_p = $paragraphs->item($paragraphs->length - 1);
$last_p->setAttribute("class", "last");
$bodytext = $dom->saveHTML();

2 个答案:

答案 0 :(得分:1)

有些人会抱怨DOMDocument在解析HTML然后是一个正则表达式时更加冗长。但是,如果这意味着使用正确的工具来完成工作,那么详细程度就可以了。

$previous_value = libxml_use_internal_errors(TRUE);
$string = '<p>hi, mom</p><p>bye, mom</p>';
$dom = new DOMDocument();
$dom->loadHTML($string);
$paragraphs = $dom->getElementsByTagName('p');
$last_p = $paragraphs->item($paragraphs->length - 1);
$last_p->setAttribute("class", "last");
$new_string = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace( array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $dom->saveHTML()));
libxml_clear_errors();
libxml_use_internal_errors($previous_value);

echo htmlentities($new_string);
// <p>hi, mom</p><p class="last">bye, mom</p>

See it in action

答案 1 :(得分:0)

如何使用simple html dom

require_once('simple_html_dom.php');

$string = '<p>hi, mom</p><p>bye, mom</p>';
$doc = str_get_html($string);
$doc->find('p', -1)->class = 'last';
echo $doc;
// <p>hi, mom</p><p class="last">bye, mom</p>