使用正则表达式替换html字体标记

时间:2010-12-12 02:06:28

标签: php html regex preg-replace

我想替换字符串中的HTML <font> - 标记(所有出现)。

示例字符串:

Line1<div><font class="blablabla" color="#33FF33">Line2</font></div><div>Line3

或:

Line1<div><font color="#33FF33">Line2</font></div><div><font color="#FF3300">Li</font>ne3

字体(starttag)应该用颜色替换,以便根据我们得到的两个例子:

Line1<div>33FF33Line2</font></div><div>Line3
Line1<div>33FF33Line2</font></div><div>FF3300Li</font>ne3

我尝试了以下(其中包括:P):

preg_replace('/<font.*color="#([0-9a-fA-F]){6}">/', '{1}', $string)

我认为我的方向是正确的,不过我觉得它离目前这么近很近:)

当我在字符串中使用它时只有一个fonttag,它会删除字体标记(我必须用替换{1}弄乱一些东西)。 当我在其中使用多个fonttags的字符串上使用它时,它也会这样做。但不仅要删除第一个fonttag,还要删除从第一个fonttag到下一个(或最后一个)fonttag的所有内容。

确定。

让我们忘记HTML代码解析讨论一段时间。

如果我有以下文字怎么办:

This colorcode (#333333) is so cool
This colorcode (orange: #ff3300) is way cooler

我希望文本成为:

This colorcode 333333 is so cool
This colorcode ff3300 is way cooler

我看到的情况相同,或者我现在无知?

2 个答案:

答案 0 :(得分:3)

preg_replace('~<font[^>]*\scolor="#([0-9a-fA-F]{6})"[^>]*>~', '$1', $string);
默认情况下,

*和其他量词是贪婪的,这就是为什么你得到了带有多个字体标签的字符串的意外收缩;它只是匹配得太多了。你可以通过添加问号(.*?)使它们变得非贪婪,但是其他因素仍然会导致它们消耗超过你想要的值。在这种情况下,最好使用一个更具体的表达式([^>]*),它不能匹配它开始的标记。

除此之外,在您发布的代码中,您使用{1}代替$1进行反向引用,并且您在括号外面有量词({6}),因此您只会永远捕捉到最后一位数,而不是所有六位数。该代码不应该返回您发布的结果,更不用说正确的结果了。

至于你更新的问题:

preg_replace('~\([^)]*#([0-9a-fA-F]{6})[^)]*\)~', '$1', $string);

答案 1 :(得分:0)

RegEx非常方便,但我会怀疑你是否可以使用RegEx捕获每一个案例。字符串中的标签怎么样?

我写了一些蜘蛛侠代码,结果只是逐个元素地解析整个文档。这是我发现让它变得可靠的唯一方法。

请参阅:http://blackbeltcoder.com/Articles/strings/parsing-html-tags-in-c/