Я работаю над извлечением ссылок из содержимого электронных писем и поэтому использую Regex
и String.Split
для извлечения важной информации из уже проанализированного Content-type: text/html
.
, так как я никогда не связывался с регулярными выражениями дотеперь я использовал онлайн-редактор, который предоставил часть своего электронного письма и построил вокруг него Regex pattern
.Сейчас, похоже, все работает отлично, но мой код - беспорядок, вызванный тем, что я не совсем понимаю, что я написал.
В настоящее время я работаю с извлечением ссылок, удаляя определенные части письма (которыеHTML-теги), а затем дважды разделяет полученную строку.
Это пример, на котором я протестировал свой Regex
(именно так выглядит Контент, когда я извлекаю его как строку, я просто заменилиспользовали ссылки с похожими примерами):
<div dir="ltr">
<div>Link text == link (link text would be changed to "Protected link"):
<a href="http://www.google.de"
target=5Fblank">
Protected link
</a>
</div>
<div>Link text != link (link text and link would be rewritten and not equal):
<a href="http://www.google.de">
http://www.google.com
</a>
</div>
<div>Link text != link (link would be rewritten but not link text):
<a href="http://www.google.de">
Click!
</a>
</div>
<div>Link text != link (link would be not rewritten, in whitelist):
<a href="http://www.google.de">
Click!
</a>
</div>
<div>Link is not rewritten:
<a href="http://www.google.de">
http://www.google.de
</a>
</div>
<div>Link text != link (no protocol in link text and would be not rewritten):
<a href="http://www.google.de">
www.google.de
</a>
</div>
И Regular Expression
, который я использовал, выглядит так:
"(href=\"[a-zA-Z0-9-:/.=?]*\"*[a-zA-Z0-9=\" ]*)([>a-zA-Z0-9-:/.,;\"=!? \t\n]*)"
После написания извлеченных ссылоки связываю тексты с массивом, который я разделяю дважды.
Сначала с этим >
символом, а затем, если извлеченная строка начинается с href="
и разделяется на "
символов.
var linkParser = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
string[] links = new string[linkParser.Matches(text).Count];
int t = 0;
foreach (Match ma in linkParser.Matches(text))
{
links[t] = ma.Value;
t++;
}
var list = new List<String[]>();
string[] temp;
for (int i = 0; i < links.Length; i++)
{
temp = links[i].Split('>');
list.Add(temp);
}
var pairs = new List<String[]>();
for (int i = 0; i < list.Count; i++)
{
string[] tmp = list[i];
for (int j = 0; j < tmp.Length; j++)
{
if (tmp[j].StartsWith("href=\""))
{
pairs.Add(new String[]
{
tmp[j].Split(new string[]
{
"href=\""
}, StringSplitOptions.None)[1].Split('"')[0], tmp[j + 1]
});
}
}
}