【问题标题】:Regular expression to replace match keywords outside html tags AND anchor (a) tag text正则表达式替换html标签和锚(a)标签文本之外的匹配关键字
【发布时间】:2014-01-25 09:21:16
【问题描述】:

我正在开发一个 asp.net 应用程序。我想添加一个关键字链接系统。

我想让关键字成为另一个页面的超链接。但是,如果它当前链接(到任何页面),我不应该链接关键字。例如:

it is a <a href="http://www.somesite.com">linked keyword</a> and it should be a linked keyword.

应该转换为:

it is a <a href="http://www.somesite.com">linked keyword</a> and it should be a linked <a href="http://newlycreatedLink.com">keyword</a>.

如您所见,第一个关键字应该保持不变。

你能帮我解决这个问题吗?

我在 asp.net 论坛中找到了this link。但我应该调整答案以排除当前链接的关键字。我到处搜索,但一无所获。

【问题讨论】:

    标签: c# html asp.net regex


    【解决方案1】:

    要检查关键字是否为“外部”,look ahead

    • (?= 如果关键字后面有一个开头 &lt;tag$ 结尾
    • [^&lt;&gt;]* 任意数量的字符,不是 &gt;&lt;
    • 后跟(?:&lt;\w|$),其中\w 是单词字符[a-zA-Z_0-9] 的简写

    所以模式可能看起来像:

    String pattern = @"(?i)\bkeyword\b(?=[^<>]*(?:<\w|$))";
    
    String replacement = @"<a href=\"http://newlycreatedLink.com\">\0</a>";
    

    将关键字放入词边界\b 并使用(?i) i 修饰符以不区分大小写。

    所以这只会替换keyword,后面跟着一个开始标签或结尾。


    更新:要替换keyword 也是“内部”标签,这些标签不以&lt;/a 结尾,添加|&lt;\/[^a]

    String pattern = @"(?i)\bkeyword\b(?=[^<>]*(?:<\w|<\/[^a]|$))";
    

    【讨论】:

    • 谢谢@Jonny,这几乎是我要找的,但问题是它会忽略所有标签中的文本。例如,这不会替换 &lt;p&gt;keyword&lt;/p&gt;
    • @KiNG 如果您知道您允许关键字在“内部”添加哪些附加标签,可能希望将这些标签列入白名单,例如:(?i)\bkeyword\b(?=[^&lt;&gt;]*(?:&lt;\w|&lt;\/p|$)) ... 添加或@ 987654341@
    【解决方案2】:

    不要使用正则表达式来解析复杂的 HTML。改用适当的 HTML 解析器 — here's why

    【讨论】:

    • LOL :)) 这真的很有趣 :) 我尝试使用 DOM 文档解析器,但我的简单任务的开销很高。我不想用正则表达式解析 html,它是一个简单的替换,我认为链接正则表达式 (?&lt;!&lt;[^&gt;]*)keyword(?&lt;![^&gt;]*&lt;) 的一个小改动可以满足我的需要。但是我的正则表达式知识真的很低:(
    猜你喜欢
    • 2011-12-09
    • 2016-03-31
    • 2020-05-22
    • 2011-12-15
    相关资源
    最近更新 更多