#c#
#c#
Вопрос:
Я пытаюсь сгенерировать функцию, которая может генерировать URL-адрес ссылки на текст на основе этого плагина выделения текста — ссылка на фрагмент текста для HTML-страниц
Программно генерировать ссылку на выделяемый абзац.
Я полагаю, что могут быть некоторые лучшие алгоритмы, которые уже доступны, чтобы мне не приходилось снова изобретать велосипед.
Например, создайте функцию C #, которая принимает URL-адрес и абзац (для выделения) и возвращает textHighlighterurl.
[Fact]
public void GettextHighlighterURL()
{
string initialFileUrl = "https://learn.microsoft.com/en-us/azure/cognitive-services/cognitive-services-and-machine-learning";
string answer = "Machine learning is a concept where you bring together data and an algorithm to solve a specific need. Once the data and algorithm are trained, the output is a model that you can use again with different data. The trained model provides insights based on the new data."
"[Machine Learning](https://learn.microsoft.com/en-us/azure/cognitive-services/cognitive-services-and-machine-learning)";
string actual = HighlighterHelper.GetTextHighLighterUrl(initialFileUrl, answer);
string expected= "https://learn.microsoft.com/en-us/azure/cognitive-services/cognitive-services-and-machine-learning#object:~:text=Machine learning is a concept ,insights based on the new data."
Assert.Equal(expected, actual);
}
Ниже опубликовано то, что я пробовал до сих пор, и это работает только в 10% случаев. Как я могу улучшить отсюда? Я полагаю, что могут быть некоторые лучшие алгоритмы, которые уже доступны, чтобы мне не приходилось снова изобретать велосипед.
public string GetTextHighLighterUrl(string firstValidFileUrl, string answer)
{
var sb = new StringBuilder();
var textHighLighterUrl = string.Empty;
var highlightText = answer.Replace(firstValidFileUrl, "");
highlightText = highlightText.Replace("()", "");
highlightText = $"{Regex.Replace(highlightText, @"[[^]]*]", "")}"; // remove text within square brackets.
highlightText = $"{Regex.Replace(highlightText, @"t|r", "$$")}";
highlightText = RemoveExtraSentences(highlightText, "$$").Trim();
highlightText = highlightText.Replace("$$", "");
highlightText = FilterWhiteSpaces(highlightText);
highlightText = highlightText.Replace("$", "");
highlightText = highlightText.Replace("(/)", "");
highlightText = highlightText.Replace(""", "%22");
highlightText = highlightText.Replace(",", "%2C");
if (!ContainsOnlyAlphaNumericCharacters(highlightText))
{
//remove sentences with special char and get a safe sentence
highlightText = GetCleanSentence(highlightText);
}
if (highlightText.Length > 50)
{
var textArrayn = highlightText.Split("n"); //if ans contains n
if (highlightText.Contains("n") amp;amp; textArrayn?.Length == 2)
{
textArrayn = highlightText.Split("n");
}
else
{
textArrayn = new List<string>().ToArray();
}
var textArray = highlightText.Split();
var n = textArray.Length;
sb.Clear();
for (int i = 0; i < 5; i )
{
if (IsValidIndex(i, textArray))
{
sb = sb.Append(textArray[i] "%20");
}
}
var start = sb.ToString();
if (start.Contains(","))
{
var tempStart = start.Split(",");
start = tempStart[0].ToString();
}
if (textArrayn.Length > 0)
{
start = textArrayn[0].ToString(); //if ans contains n then start from there
}
sb.Clear();
for (int i = n - 6; i <= n; i )
{
if (IsValidIndex(i, textArray))
{
if (i != n - 1)
{
sb = sb.Append(textArray[i] "%20");
}
else
{
sb = sb.Append(textArray[i]);
}
}
}
var end = sb.ToString().Trim();
end = end.Replace(",", "%2C");
sb.Clear();
sb = sb.Append(firstValidFileUrl).Append("#object:~:text=").Append(start).Append(",").Append(end);
textHighLighterUrl = sb.ToString();
sb.Clear();
}
else
{
sb.Clear();
highlightText = highlightText.Replace(" ", " ");
if (!string.IsNullOrEmpty(highlightText))
{
sb = sb.Append(firstValidFileUrl).Append("#object:~:text=").Append(highlightText);
}
else
{
sb = sb.Append(firstValidFileUrl);
}
textHighLighterUrl = sb.ToString();
sb.Clear();
}
textHighLighterUrl = $"{Regex.Replace(textHighLighterUrl, @".{2,}", "")}";//edge cases.Remove Multiple dots
textHighLighterUrl = textHighLighterUrl.Replace(", ,", ",");
return textHighLighterUrl;
}
Комментарии:
1. Вам нужно будет создать несколько тестов с минимальными данными, чтобы показать, чего вы хотите достичь, поскольку мне трудно понять, каковы входные данные или какими вы ожидаете получить результаты
2. @MichalCiechan добавил один тестовый пример
Ответ №1:
Я не знаю, полностью ли я понимаю, чего вы пытаетесь достичь, но попробуйте этот код:
Учитывая ваши входные данные, он вернет эту ссылку: https://learn.microsoft.com/en-us/azure/cognitive-services/cognitive-services-and-machine-learning#:~:text=Machine learning is a, based on the new data.
using System.Web;
// #:~:text=[prefix-,]textStart[,textEnd][,-suffix]
private string Go(string url, string text)
{
int SEGMENT_SIZE = 20;
//remove everything after last bracket
text = Regex.Replace(text, @"[(?:.(?![)) $", "");
string link;
if (text.Length < 100)
{
link = $"{url}#:~:text={Uri.EscapeUriString(text)}";
}
else
{
var startBreak = text.IndexOf(" ", SEGMENT_SIZE);
var endBreak = text.Substring(0, text.Length - SEGMENT_SIZE).LastIndexOf(" ");
link = $"{url}#:~:text={Uri.EscapeUriString(text.Substring(0, startBreak))},{Uri.EscapeUriString(text.Substring(endBreak))}";
}
return link;
}