Но она заменила все URL-адреса предварительного просмотра, включая раздел содержимого.
Мне нужно оставить некоторые похожие URL-адреса в качестве общих URL-ссылок, и я хочу изменить выбранные мной URL-адреса.
Вот мой текущий код:
private async Task ReplaceUrlsWithPreviews(string content)
{
var anchorRegex = new Regex(@"]*href=[""'](?[^""']+)[""'][^>]*>(?.*?)", RegexOptions.IgnoreCase);
// Find all anchor tags
var matches = anchorRegex.Matches(content);
foreach (Match match in matches)
{
var url = match.Groups["url"].Value;
var linkText = match.Groups["text"].Value;
// Fetch metadata for the URL
var preview = await FetchMetadataFromUrl(url);
// If metadata is found, generate preview HTML
if (preview != null)
{
var previewHtml = GeneratePreviewHTML(preview);
// Replace the entire tag with the generated preview HTML
content = content.Replace(match.Value, previewHtml);
}
}
return content;
}
public static bool isValidUrl(string url)
{
string pattern = @"^[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*[^\.\,\)\(\s]$";
Regex reg = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
var isMatch = !reg.IsMatch(url);
return isMatch;
}
// Fetch metadata (OpenGraph/TwitterCard) for URL
private async Task FetchMetadataFromUrl(string url)
{
var httpClient = new HttpClient();
var response = await httpClient.GetStringAsync(url);
var doc = new HtmlDocument();
doc.LoadHtml(response);
var preview = new LinkPreview
{
Title = GetMetaTagContent(doc, "og:title") ?? GetTitleTag(doc),
Description = GetMetaTagContent(doc, "og:description")??"",
Image = GetMetaTagContent(doc, "og:image") ?? "/img/preview.png",
Url = url
};
return preview;
}
private string? GetMetaTagContent(HtmlDocument doc, string property)
{
return doc.DocumentNode.SelectSingleNode($"//meta[@property='{property}']")?.GetAttributeValue("content", null);
}
private string GetTitleTag(HtmlDocument doc)
{
return doc.DocumentNode.SelectSingleNode("//title")?.InnerText??"";
}
// Generate HTML for link preview
private string GeneratePreviewHTML(LinkPreview preview)
{
return $@"

Подробнее здесь: https://stackoverflow.com/questions/791 ... to-asp-net