Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 不使用';如果字符串为';在html锚定标记中插入文本_.net_Regex - Fatal编程技术网

.net 不使用';如果字符串为';在html锚定标记中插入文本

.net 不使用';如果字符串为';在html锚定标记中插入文本,.net,regex,.net,Regex,我正在为blogengine.net编写一个自动链接扩展,它将博客文章中的关键短语自动链接到特定的URL。我发现的问题是,自动链接的短语列表通常是彼此的子集,例如“bmw”是“bmw汽车租赁”的子集,因此,如果我使用正则表达式首先自动链接“bmw汽车租赁”,然后自动链接短语“bmw”,接下来,前者已经是自动链接的。先行性很重要,较长的短语必须首先自动链接,然后是较小的短语,这些短语可能是较长短语的子集 我需要的是一个正则表达式,如果它已经在一个锚标签内,那么它将取消比赛,也就是说,我的短语应该取

我正在为blogengine.net编写一个自动链接扩展,它将博客文章中的关键短语自动链接到特定的URL。我发现的问题是,自动链接的短语列表通常是彼此的子集,例如“bmw”是“bmw汽车租赁”的子集,因此,如果我使用正则表达式首先自动链接“bmw汽车租赁”,然后自动链接短语“bmw”,接下来,前者已经是自动链接的。先行性很重要,较长的短语必须首先自动链接,然后是较小的短语,这些短语可能是较长短语的子集

我需要的是一个正则表达式,如果它已经在一个锚标签内,那么它将取消比赛,也就是说,我的短语应该取消

我不必经常使用正则表达式,所以我对它们并不完全熟悉,到目前为止,我已经成功地组合了一个正则表达式,它将匹配锚标记,但我需要的不是相反的正则表达式。例如
]*>东西(.*)

欢迎提出任何建议和建议

添加,并希望最终解决方案。。。。只有时间才能证明:- 经过一点尝试和错误,我使用的最终正则表达式如下。这是基于我标记为答案的解决方案:-

(?<!<a [^<]+)(?<!<img [^<]+)(?<=[ ,.;!]+)search phrase goes here(?=[ ,.;&!]+)(?!!.*<\\a>)
(?)
它允许匹配的文本前面和后面有空格和基本标点符号,还允许编码字符,如不间断空格
等。它还避免了匹配img标记中的任何内容。 我意识到这仍然不是100%,但就要求而言,这就足够了


感谢所有人的帮助和投入。

消极的向后看和向前看有助于在这种情况下,只有在前面没有(向后看)的情况下,以下内容才与
某物相匹配:

(?诀窍是使用非贪婪的,然后为锚点元素的结尾添加一个前瞻。我发现使用类似的工具可以更轻松地创建此类正则表达式

var text = "Final report of the commercial starship Nostromo, third officer reporting. The other members of the crew, Kane, Lambert, Parker, Brett, Ash and Captain Dallas, are dead. Cargo and ship destroyed. I should reach the frontier in about six weeks. With a little luck, the network will pick me up. This is Ripley, last survivor of the Nostromo, signing off.";
var phrases = new List<KeyValuePair<string, string>> { 
    new KeyValuePair<string,string>("Nostromo", "http://www.imdb.com/media/rm3374159872/tt0078748"),
    new KeyValuePair<string,string>("starship Nostromo", "http://en.wikipedia.org/wiki/Alien_%28film%29#Spaceships_and_planets")};

foreach (var phrase in phrases.OrderByDescending(kv => kv.Key.Length))
{ 
    text = new Regex("(?<!<a [^<]+)" + phrase.Key + "(?!!.*<\\a>)").
                    Replace(text, "<a href=\"" + 
                                    phrase.Value + "\">" + 
                                    phrase.Key + "</a>");
}
var text="商业星际飞船Nostromo的最终报告,三副报告。其他船员,凯恩,兰伯特,帕克,布雷特,阿什和达拉斯船长都死了。货物和飞船被毁。我应该在六周后到达边境。如果运气好的话,网络会接我。这是Ripley,Nostromo号的最后一名幸存者,签下了off。”;
var短语=新列表{
新的KeyValuePair(“Nostromo”http://www.imdb.com/media/rm3374159872/tt0078748"),
新的KeyValuePair(“星际飞船Nostromo”http://en.wikipedia.org/wiki/Alien_%28film%29#Spaceships_and_planets")};
foreach(短语中的var短语。OrderByDescending(kv=>kv.Key.Length))
{ 

text=新的正则表达式(“(?啊,来吧,乔纳斯,你告诉我,在任何情况下,正则表达式都不能与html一起工作?我在寻找一个简单的例子,我认为它只是…匹配短语,只要它前面没有一个a标记,在标记和短语之间没有其他a标记,并且在没有其他a标记的情况下关闭一个标记。这真的是t吗regex的帽子很难?嗯…4352次向上投票是我在这里看到的最极端的向上投票,该死,我真的不想手动解析它!现在我看到,在这种情况下,你实际上只解析HTML的一个很小的子集,所以我猜regex可以工作。至少如果文本本身没有其他HTML元素。谢谢steinar,我会看一看在消极的情况下,向后看/向前看,看看我的情况是否足够简单,可以用它来解决。正如在对问题的评论中所提供的链接中指出的,我不希望这导致我将我的意识传送到一个不断尖叫和从死者中复活永恒该死的灵魂的世界中。是的。我确实相信,网络允许可变长度的lookbehind。因此,您可能想尝试以下方法:
(?]*>)stuff
(或者可能是
stuff(?]*>stuff)
,这可能会快一点)@Ridgerunner,+1,用Expresso测试了你的正则表达式,看起来它能完成任务,非常感谢。+1 for Expresso,昨晚发现它是一个构建和测试正则表达式的宝贵工具的一部分。谢谢Jonas,你的正则表达式适用于我测试过的案例。
var text = "Final report of the commercial starship Nostromo, third officer reporting. The other members of the crew, Kane, Lambert, Parker, Brett, Ash and Captain Dallas, are dead. Cargo and ship destroyed. I should reach the frontier in about six weeks. With a little luck, the network will pick me up. This is Ripley, last survivor of the Nostromo, signing off.";
var phrases = new List<KeyValuePair<string, string>> { 
    new KeyValuePair<string,string>("Nostromo", "http://www.imdb.com/media/rm3374159872/tt0078748"),
    new KeyValuePair<string,string>("starship Nostromo", "http://en.wikipedia.org/wiki/Alien_%28film%29#Spaceships_and_planets")};

foreach (var phrase in phrases.OrderByDescending(kv => kv.Key.Length))
{ 
    text = new Regex("(?<!<a [^<]+)" + phrase.Key + "(?!!.*<\\a>)").
                    Replace(text, "<a href=\"" + 
                                    phrase.Value + "\">" + 
                                    phrase.Key + "</a>");
}