【问题标题】:Replacing html font tag using regex使用正则表达式替换 html 字体标签
【发布时间】:2010-12-12 02:06:28
【问题描述】:

我想替换(所有出现的)HTML <font>-tag 在一个字符串中。

示例字符串:

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)

我认为我的方向是正确的,但我认为它更像是如此接近但又如此遥远:)

当我在其中只有 1 个字体标签的字符串上使用它时,它会删除字体标签(我一定是用替换 {1} 搞砸了一些东西)。 当我在其中包含多个字体标签的字符串上使用它时,它也是如此。但不仅要删除第一个字体标签,还要删除从第一个字体标签到下一个(或最后一个)字体标签的所有内容。

好的。

让我们暂时忘记 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

和我看到的一样,还是我现在无知?

【问题讨论】:

标签: php html regex preg-replace


【解决方案1】:
preg_replace('~<font[^>]*\scolor="#([0-9a-fA-F]{6})"[^>]*>~', '$1', $string);

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

除此之外,在您发布的代码中,您使用 {1} 而不是 $1 作为反向引用,并且括号外有量词 ({6}),因此您只能捕获最后一个数字,不是你想要的全部六个。该代码不应该返回您发布的结果,更不用说正确的结果了。

至于你更新的问题:

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

【讨论】:

    【解决方案2】:

    RegEx 既方便又好用,但我会质疑您是否可以使用 RegEx 捕获所有案例。字符串中的标签等呢?

    我编写了一些爬虫代码,最后只是逐个元素地解析整个文档。这是我发现使其可靠的唯一方法。

    见:http://blackbeltcoder.com/Articles/strings/parsing-html-tags-in-c/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多