我试图清理一个HTML输入字段。我想保留一些标记,但不是全部,所以在阅读元素值时不能只使用.text()
。我在Safari的JavaScript中遇到了一个正则表达式的问题。下面是代码片段(我从另一个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
但这似乎并没有改变什么(至少在我尝试的几个测试器/解析器中没有,比如https://regex101.com/r/yhmT8w/1)。我也尝试了/U
标志,但没有帮助(或者这些解析器没有识别它)。
有什么建议吗?
3条答案
按热度按时间4uqofj5v1#
模式中存在几个错误和可能的改进:
(1)- 〉关于引号和href属性值:
要处理单引号、双引号或无引号,您可以使用捕获组和反向引用:
详细内容:
请注意,使用此子模式时,您添加了一个捕获组,
a
标记之间的内容现在位于捕获组3中。考虑将替换字符串$2
更改为$3
。最后,你可以这样写你的模式:
nuypyhwy2#
使用
href="[^"]+"
而不是
href=\"(.*?)\"
基本上这将抓住任何字符,直到它满足下一个
"
虽然实现类似markdown语法的东西可能会更容易,这样你就不必担心剥离错误的标签,只要在显示文本时剥离所有并将markdown替换为它们的html标签对应物。
例如,在SO上,您可以使用
[link text](http://linkurl.com)
而执行替换的正则表达式是
或者使用一个已经制作好的库来进行转换。
nwo49xxi3#
谢谢大家的建议;它帮助了我很多,并有很多改进它的想法。
但我想我找到了原始正则表达式失败的具体原因。卡西米尔的回答触及到了这一点,但我不明白,直到我碰巧在这个修复。
我一直在错误的地方寻找问题,在这里:
我能够通过在
a.*hre
区域后插入一个问号来修复我的原始查询,如下所示:我确实打算利用这里的其他建议来进一步改进我的发言。
-- C