我想替换字符串中的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
我看到的情况相同,或者我现在无知?
答案 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/