我正在为自己的phpBB3做点什么,我正试图将这些笑容转换回oringinal笑脸状态,例如。
:) :( :O :P
因为笑脸的HTML包含这个:
/<img src=".*" alt="(.*)" title=".*">/gi
取代:
$1
然而,当我有多个表情时,它只显示最后一个笑脸,例如如果它是这样的:
alt text 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" />
答案 0 :(得分: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
答案 1 :(得分:1)
使用*?
和+?
进行非贪婪匹配:
/<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
仍在产生有效的匹配,但它不是你想要的。 ?
/ *
之后的+
使正则表达式消耗了成功匹配所需的最小字符串。阅读“注意贪婪!”部分在this article。
我还想添加一般警告,即正则表达式不是解析HTML的最佳工具。如果src
属性具有转义"
,即使我的正则表达式也会中断。