2017-08-31 182 views
-1

我想创建一个正则表达式来匹配包含我的域的所有href链接,并且我将最终删除这些链接。它运行良好,直到我遇到一个href链接,该链接在标记中包含另一个HTML标记。正则表达式匹配Href和删除

正则表达式声明:

(<a[^<]*coreyjansen\.com[^<]*>)([^"]*?)(<\/a>) 

它在此声明,没有问题在href链接匹配

Need a lawyer? Contact <span style="color: #000000"><a 
href="http://coreyjansen.com/">Random text is great</a> <a 
href="http://coreyjansen.com/practice/family/">Corey is awesome</a></span> 

这是无法同时匹配A HREF链接这一点声明:

<strong><a href="http://coreyjansen.com/"><img class="alignright size-full 
wp-image-12" src="http://50h0.com/wp-content/uploads/2014/06/lawyers.jpg" 
alt="lawyers" width="250" height="250" /></a> 

我一直在试图玩忽视的字符集,没有运气。如果我删除被忽略的字符集,结果会发生什么,它会将匹配的两个链接(例如2作为一个匹配项)匹配。

+1

改为使用您的编程语言的解析器! – Jan

+0

为什么不通过HTML标签进行搜索,您为什么不在整个HTML代码中搜索您的域名,然后决定(手动)哪些链接属于哪个链接?这可以防止你需要一个解析器,也会捕获像JavaScript重定向,CSS链接,图像标签等东西。 – ctwheels

回答

0

这里的问题是[^<]*>匹配一切,直到最后>。这就是星号的贪婪行为。在星号之后追加?(您已经在查询的其他部分中完成),可以使其变得非贪婪。然后它会匹配所有内容,直到>的第一次出现为止。然后你必须改变你的正则表达式的中间部分,即。赶上一切,直到第一个标签</a>这样的:

(<a[^<]*coreyjansen\.com[^<]*?>)(.*?)(<\/a>) 
+0

这工作真棒。现在在最后一场比赛中,我正在尝试对它进行分离,以便我可以删除A href并且这是我正在使用的表达式 '/href\s*=\s*[\'|"]\s*(.* )\ s * [\'|“]/i' 但它现在匹配href标记外 – MrToast

0

我用下面的正则表达式玩,它似乎是工作:

<a.*coreyjansen\.com.*</a> 

它捕捉包含您的网站名称锚标记之间的任何。我使用JavaScript模式从www.regexpal.com匹配,根据不同的语言可能是下面的正则表达式略有不同

0

使用只匹配a标签

(<a[^>]*coreyjansen\.com[^>]*>) 

实例数据

<strong><a href="http://coreyjansen.com/"><img class="alignright size-full 
wp-image-12" src="http://50h0.com/wp-content/uploads/2014/06/lawyers.jpg" 
alt="lawyers" width="250" height="250" /><a href="http://coreyjansen.com/"><a href="http://coreyjansen.com/"/></a> 

以上正则表达式将匹配所有三个a标签与您所需的域名。

上述尝试在regex

0

你需要匹配的标签<a开始之前再焦炭>匹配的地址。你匹配错误的字符。当你匹配时,然后<a></a>之间瞬间显示链接。我不知道为什么你比较不包含引号,每个标签属性(在HTML5中)在引号内都有值,所以你需要匹配除链接结尾标签</a>以外的所有内容。它由((?!string to not match).)*完成,之后应该跟随</a>。结果正则表达式是:

(<a[^>]*coreyjansen\.com[^>]*>)((?!<\/a>).)*(<\/a>)