替换下一次出现的标签

时间:2013-07-03 09:17:03

标签: php str-replace

我有一个带有一些标记的大字符串,我想改变它以便与fpdf一起工作。

<span style="text-decoration: underline;">some text</span>

我需要用

替换这里的标签
<i>some text</i>

然而简单的str_replace();不会工作,因为有不应更换的span标签。我需要制作一些找到<span style="text-decoration: underline;">

的东西

然后查找</span>的下一次出现并仅替换它。我对如何做到这一点没有丝毫的线索。我看过http://us.php.net/strpos但不确定如何实现它,如果这将是解决方案。谁能给我一些指示?

感谢。

2 个答案:

答案 0 :(得分:0)

这应该可以解决问题:

<?php
    $in = '<span>Invalid</span><span style="text-decoration: underline;">some text</span><span>Invalid</span>';
    $out = preg_replace('@<span style=".*">([^<]+)<\/span>@', '<i>\1</i>', $in);
    echo $out;
?>

View on Codepad.org

您还可以限制标记中要查找的文本,例如,仅限字母数字和空格:

<?php
    $in = '<span>Invalid</span><span style="text-decoration: underline;">some text</span><span>Invalid</span>';
    $out = preg_replace('@<span style=".*">([\w|\s]+)<\/span>@', '<i>\1</i>', $in);
    echo $out;
?>

View on Codepad.org

答案 1 :(得分:0)

$dom = new domDocument;
$dom->loadHTML($html); 
$spans = $dom->getElementsByTagName('span');
foreach ($spans as $node){
    $text = $node->textContent;
    $node->removeChild($node->firstChild);
    $fragment = $dom->createDocumentFragment();
    $fragment->appendXML('<i>'.$text.'</i>');
    $node->appendChild($fragment);
}
$out = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace( array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $dom->saveHTML()));