2011-03-23 59 views
0

我试图用正则表达式来匹配和替换锚标签。我到目前为止是这样的:正则表达式将匹配锚与#在href中的#

"(<a href=['\"]?([\\w_\\.]*)['\"]?)" 

这种方法的问题是,它无法捕获也有#值的hrefs。我试过

"(<a href=['\"]?([\\w_\\.#]*)['\"]?)" 

"(<a href=['\"]?([\\w_\\.\\#]*)['\"]?)" 

没有成功。

我在做什么错了?

谢谢

+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – Martijn 2011-03-23 09:39:05

回答

3

我不认为这个问题是#(正常工作对我来说),但缺少其他网址字符,如-/:

怎么样的正则表达式像这样:

<a href=("[^"]+"|'[^']+'|[^ >]+) 

注:如果可能的话,使用有效的HTML解析其他DOM方法。

+0

谢谢。我想使用一个html解析器,而不是正则表达式,但是这是针对客户端的silverlight应用程序,所以我不能访问这些程序集。我想我会开发一个Web服务,为我远程执行解析,以访问完整的.NET平台(并使用DOM解析器)。 – scripni 2011-03-23 11:43:32

1
<a href=(('|")[^\2]+?\2|[^>]+) 
+0

如果URL包含在''''''中,这将不会很好。或者,如果URL没有用引号括起来(不正确的xhtml,但似乎OP正在尝试匹配这样的链接)。 – Czechnology 2011-03-23 10:34:24

+0

感谢您的警告..我做了必要的更正.. – 2011-03-23 11:00:17

+0

您也应该在否定列表中有一个空格(对于没有引号和更多属性的情况)。这个正则表达式的问题是,如果url包含另一个引号或'>'(非转义),它会过早结束。这就是为什么我使用那个看起来丑陋的列表式正则表达式。 – Czechnology 2011-03-23 11:17:38

1

如果您只是想替换锚部分使用字符串操作。它们更简单更快

var parts = "http://someurl.com#hashpart".Split("#"); 
// yields "http://someurl.com" and "hashpart" as array. 
// you may want to check if the result has length of two 
// if it does : 
var newUrl = string.Format("{0}#{1}" parts[0], "some replacement for hashpart"); 

如果您的URL包含多个散列,请尝试使用string.Substring在第一个hashtag处进行分割。

var url = "http://someurl.com#hash#hashhash"; 
var hashPos = url.IndexOf("#"); 
var urlPart = url.Substring(hashPos); 
var hashPart = url.Substring(hashPos +1, url.length - hashPos -1); 

应该工作,没有验证地写下来,也许你必须折腾一些+/- 1才能找到正确的位置。