preg_replace只删除字符串的一部分,但使用PHP保留其余部分

时间:2010-08-03 11:14:54

标签: php html regex

我正在尝试在PHP中的字符串中进行替换。如何删除仅在PHP组中的部分?

<font.+?(size.+?.)>

我想删除size = x的地方。问题是我无法获取

 $text = preg_replace("<font.+?(size.+?.)>","",$text);

工作的功能。

的示例来源
<font style="background-color: rgb(255, 255, 0);" size="2"><strong><u>text</u></strong></font>
<font size="2">more text</font>

进入这个

<font style="background-color: rgb(255, 255, 0);" ><strong><u>text</u></strong></font>
<font>more text</font>

我想说。哪里有字体标签,如果我看到尺寸 - 任何东西都会移除尺寸属性,但保留其他所有内容。

3 个答案:

答案 0 :(得分:4)

$dom = new DOMDocument();
$dom->loadHTML($htmlstring);
$x = new DOMXPath($dom);
$list = $x->query('//font/@size');
for($i = $list->length-1;$i>=0;$i--){
    $attr = $list->item($i);
    $attr->ownerElement->removeAttributeNode($attr);
}

答案 1 :(得分:1)

正则表达式是一种糟糕的HTML操作方式,但是说,执行这种正则表达式匹配和部分替换的一般技术是匹配:

(<font.+?)(size.+?.)(>)
\________/\________/\_/
    1         2      3

然后用

替换
$1$3

这取代了对第1组和第3组匹配的替换反向引用,将组2排除,有效地删除了第2组匹配的内容。

参考

答案 2 :(得分:1)

不是最好的解决方案,但要回答你的问题:

$html = <<<END
<font style="background-color: rgb(255, 255, 0);" size="2"><strong><u>text</u></strong></font>
<font size="2">more text</font>
END;

$text = preg_replace('/(<font.*?)(size\s*=[^\s>]*)([^>]*)>/si', '\1\3>', $html);
var_dump($text);