2009-04-30 21 views
3

長いテキスト文字列を検索して置き換える必要があります。#regexを使用して、一致するテキストの再利用部分を検索して置き換えます。

<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)を再利用する仕組みです。コンテンツでは、URLとリンクテキストのように、このIDはリンクごとに変化します。

おかげで、

デビッド

編集:明確にするためには、私は彼らで壊れたリンクを修正するために、長いテキストフィールドの数百人を介して実行するにはC#のコードを書いています。各単一のテキストフィールドには、そこにいくつかの壊れたリンクを持つことができるHTMLが含まれています - 正規表現はそれらをすべて見つけて、それらを正しいバージョンのリンクで置き換える必要があります。

+0

また、このタグに一致させたいのですか、href属性の内容にregexを適用したいだけですか? – Lucero

+0

正しいhref属性とtitle属性になるように、最初のoutの不正なhref属性を分離したいだけです。私はそれがどうなるか気にしない:) @tanascius - 私はC#でこれをコーディングしています。 –

+0

正規表現を修正しました。もう一度お試しください。 – Tomalak

答えて

2

一緒にうまく再生されない塩、HTMLや正規表現の粒でこれを取る:

$1/{$2}" title="$3$4 

であなたの入力に加えて交換

(<a\s+[^>]*href=")[^"%]*%7B(localLink:\d+)%7D%7C%7C([^"]*)("[^>]*>[^<]*</a>) 

次が生成されます

<a href="/{localLink:1369}" title="Thank%20you%20for%20registering">broken link</a> 

これは、正規表現だけで得られるのと同じくらいです。代わりのURLエンコーディングを削除するには、MatchEvaluator delegateを使用する必要があります。

+0

これはとても近いです。お手伝いをありがとうございます。いくつかの点: 1.正規表現はまた、正しいリンクと一致します。私は望ましくありません。 2.壊れたリンクを置き換えますが、正しくはありません。 link - url.stillを削除する必要があります。ここでもビット、}} || title属性で指定します。 3.元のソースはhtmlでエンコードされていますが、%7BlocalLink:1369%7Dの代わりに{localLink:1369}を使用するには置き換えられたテキストが必要です。 お手伝いできますか? ありがとう、 David –

+0

正規表現を少し変更しました。 – Tomalak

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"); 
    } 
2

は、置換文字列内の一致を含めるには、$&を使用しています。

置換文字列に使用できる他の数多くの置換マーカーがあります。see here for the listです。

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); 
    } 
+1

あなたはMatchEvaluatorの使用を理解していないと思います。 – Tomalak

関連する問題