0

我正在为我自己的 phpBB3 做一些事情,我正在尝试将这些微笑转换回原来的笑脸状态,例如

:)  :(  :O  :P

由于笑脸的 HTML 包含以下内容:

/<img src=".*" alt="(.*)" title=".*">/gi

替换为:

$1

但是,当我有多个笑脸时,它只会显示最后一个笑脸,例如,如果它是这样的:

替代文字 http://uimgz.com/i/R2e3H8g5D8.png

它变成了这样:

:twisted:

这是右边的最后一个笑脸,为什么它没有替换并返回它应该返回的所有笑脸状态:

:) :o :twisted:

正则表达式看起来不错,但我不认为是什么问题,所有正则表达式都使用for()循环通过替换循环,所以这不是问题。

多个表情符号 HTML:

<img src="./images/smilies/icon_e_smile.gif" alt=":)" title="Smile" /> <img src="./images/smilies/icon_e_surprised.gif" alt=":o" title="Surprised" /> <img src="./images/smilies/icon_twisted.gif" alt=":twisted:" title="Twisted Evil" />
4

2 回答 2

1

将正则表达式更改为此并重试:

/<img src="[^"]*" alt="([^"]+)" title="[^"]*">/gi

正则表达式引擎通常是贪婪的。它会尝试匹配最长的文本匹配的东西。在您的情况下,我将所有三个链接匹配为一个。我在这里所做的是将 src 属性中的内容限制为不包含 ",因此它不会一直匹配到第三个 src。它将其视为 src 属性./images/smilies/icon_e_smile.gif" alt=":)" title="Smile" /> <img src="./images/smilies/icon_e_surprised.gif" alt=":o" title="Surprised" /> <img src="./images/smilies/icon_twisted.gif

于 2011-01-09T19:58:27.007 回答
1

使用*?and+?进行非贪婪匹配:

/<img src=".*?" alt="(.+?)" title=".*?">/gi

您失败的示例中发生的情况是第一个.*匹配所有这些:

./images/smilies/icon_e_smile.gif" alt=":)" title="Smile" /> <img src="./images/smilies/icon_e_surprised.gif" alt=":o" title="Surprised" /> <img src="./images/smilies/icon_twisted.gif

它仍在产生有效的匹配,但这不是您想要的。?之后*/+使正则表达式消耗成功匹配所需的最小字符串。阅读“小心贪婪!”部分 在这篇文章中

我还想添加一般警告,即正则表达式不是解析 HTML 的最佳工具。例如,如果src属性有转义,即使我的正则表达式也会中断。"

于 2011-01-09T20:01:20.407 回答