【发布时间】:2014-01-24 02:01:03
【问题描述】:
我正在尝试清理 HTML 输入字段。我想保留一些标签,但不是全部,所以在读取元素值时不能只使用.text()。我在 Safari 中的 JavaScript 中使用正则表达式时遇到了一些问题。这是代码的 sn-p(我从另一个 SO 线程答案中复制了这段正则表达式):
aString.replace (/<\s*a.*href=\"(.*?)\".*>(.*?)<\/a>/gi, '$2 (Link->$1)' ) ;
这是失败的示例输入:
<a href="http://blar.pirates.net/black/ship.html">Go here please.</a></p><p class="p1"><a href="http://blar.pirates.net/black/ship.html">http://blar.pirates.net/black/ship.html</a></p>
这个想法是,href 将被拉出并作为纯文本输出到将被链接的文本旁边。所以上面的输出最终应该是这样的:
Go here please (Link->http://blar.pirates.net/black/ship.html)
http://blar.pirates.net/black/ship.html (Link->http://blar.pirates.net/black/ship.html)
但是,正则表达式在第一场比赛中一直抓取到第二个 </a> 标记,所以我丢失了第一行输出。 (实际上,只要锚元素相邻,它就会抓取到列表的最下方。)输入是一个长字符串,而不是用 CR/LF 或任何东西分割成行。
我尝试过使用这样的非贪婪标志(注意第二个问号):
/<\s*a.*href=\"(.*?)\".*?>(.*?)<\/a>/ig
但这似乎并没有改变任何东西(至少在我尝试的少数测试器/解析器中没有,其中之一在这里:http://refiddle.com)。还尝试了 /U 标志,但这没有帮助(或者这些解析器没有识别它)。
有什么建议吗?
【问题讨论】:
-
只是让您知道,您的正则表达式不足以防止
a标记,它们可以在 href 属性中使用单引号或不使用引号。或者他们可以使用内联 onclick 或其他事件处理程序。 -
幸好这不是公共系统,所以我不关心安全性。这只是试图从粘贴到此字段中的文本中删除格式。 (这是一个内部评论系统——他们在数据库中的父记录上输入 cmets。)
标签: javascript regex non-greedy