我需要搜索并替换长文本字符串。我想找到看起来像这样的断开链接的所有实例:
<a href="http://any.url.here/%7BlocalLink:1369%7D%7C%7CThank%20you%20for%20registering">broken link</a>
并修复它,使其看起来像这样:
<a href="/{localLink:1369}" title="Thank you for registering">link</a>
文本字段中可能存在多个这些断开的链接。我的困难在于如何重用匹配的ID(在本例中为1369)。在内容中,此ID从链接更改为链接,网址和链接文本也是如此。
谢谢,
大卫
编辑:为了澄清,我正在编写C#代码来运行数百个长文本字段来修复其中的断开链接。每个单独的文本字段都包含html,其中可以包含任意数量的断开链接 - 正则表达式需要全部找到它们并用正确版本的链接替换它们。
答案 0 :(得分:2)
我假设您已经解析了元素和属性。因此,要处理URL,请使用以下内容:
string url = "http://any.url.here/%7BlocalLink:1369%7D%7C%7CThank%20you%20for%20registering";
Match match = Regex.Match(HttpUtility.UrlDecode(url), @"^http://[^/]+/\{(?<local>[^:]+):(?<id>\d+)\}\|\|(?<title>.*)$");
if (match.Success) {
Console.WriteLine(match.Groups["local"].Value);
Console.WriteLine(match.Groups["id"].Value);
Console.WriteLine(match.Groups["title"].Value);
} else {
Console.WriteLine("Not one of those URLs");
}
答案 1 :(得分:2)
要在替换字符串中包含匹配项,请使用$&
。
可以在替换字符串see here for the list中使用许多其他替换标记。
答案 2 :(得分:2)
带上一粒盐,HTML和正则表达式不能很好地结合在一起:
(<a\s+[^>]*href=")[^"%]*%7B(localLink:\d+)%7D%7C%7C([^"]*)("[^>]*>[^<]*</a>)
应用于您的输入并替换为
$1/{$2}" title="$3$4
生成以下内容:
<a href="/{localLink:1369}" title="Thank%20you%20for%20registering">broken link</a>
这与单独的正则表达式一样接近。您需要使用MatchEvaluator
delegate从替换中删除URL编码。
答案 3 :(得分:1)
感谢大家的帮助。这是我最后使用的内容:
const string pattern = @"(<a\s+[^>""]*href="")[^""]+(localLink:\d+)(?:%7[DC])*([^""]+)(""[^>]*>[^<]*</a>)";
// Create a match evaluator to replace the matched links with the correct markup
var myEvaluator = new MatchEvaluator(FixLink);
var strNewText = Regex.Replace(strText, pattern, myEvaluator, RegexOptions.IgnoreCase);
internal static string FixLink(Match m)
{
var strUrl = m.ToString();
const string namedPattern = @"(<a\s+[^>""]*href="")[^""]+(localLink:\d+)(?:%7[DC])*([^""]+)(""[^>]*>[^<]*</a>)";
var regex = new Regex(namedPattern);
//const string strReplace = @"$1/{$2}"" title=""$4";
const string strReplace = @"$1/{$2}"" title=""$4";
HttpContext.Current.Response.Write(String.Format("Replacing '{0}' with '{1}'", strUrl, regex.Replace(strUrl, strReplace)));
return regex.Replace(strUrl, strReplace);
}