C# кодируют к linkify URL в строке

У вас есть несколько опечаток в вашем коде: например, "Message Box", + должно быть "Message Box" +. Вот хорошая отправная точка:

int main (int argc, char* argv[]) {
    QApplication app(argc, argv);
    QString enteredAddress = QInputDialog::getText(
        0,
        "User Address",
        "Enter address each field separated by a comma and a space: ");
    QMessageBox msgBox;
    msgBox.setText("Message Box:\n" + enteredAddress.replace(", ", "\n"));
    msgBox.show();
    return app.exec();
}
31
задан Vance Smith 17 February 2011 в 05:43
поделиться

4 ответа

Это довольно простая задача, которую можно выполнить с помощью Regex и готового к работе регулярное выражение из:

Что-то вроде:

var html = Regex.Replace(html, @"^(http|https|ftp)\://[a-zA-Z0-9\-\.]+" +
                         "\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?" +
                         "([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*$",
                         "<a href=\"$1\">$1</a>");

Вас также может заинтересовать не только создание ссылок, но и сокращение URL-адресов. Вот хорошая статья на эту тему:

См. Также :

45
ответ дан 27 November 2019 в 21:59
поделиться
protected string Linkify( string SearchText ) {
    // this will find links like:
    // http://www.mysite.com
    // as well as any links with other characters directly in front of it like:
    // href="http://www.mysite.com"
    // you can then use your own logic to determine which links to linkify
    Regex regx = new Regex( @"\b(((\S+)?)(@|mailto\:|(news|(ht|f)tp(s?))\://)\S+)\b", RegexOptions.IgnoreCase );
    SearchText = SearchText.Replace( "&nbsp;", " " );
    MatchCollection matches = regx.Matches( SearchText );

    foreach ( Match match in matches ) {
        if ( match.Value.StartsWith( "http" ) ) { // if it starts with anything else then dont linkify -- may already be linked!
            SearchText = SearchText.Replace( match.Value, "<a href='" + match.Value + "'>" + match.Value + "</a>" );
        }
    }

    return SearchText;
}
6
ответ дан 27 November 2019 в 21:59
поделиться

Это не так просто, как вы можете прочитать в этом сообщении в блоге Джеффа Этвуда . Особенно трудно определить, где заканчивается URL-адрес.

Например, является ли часть URL-адреса завершающей скобкой или нет:

  • http: //en.wikipedia.org/wiki/PCTools (CentralPointSoftware)
  • URL в скобках (http: //en.wikipedia.org) more text

В первом случае скобки являются частью URL. Во втором случае их нет!

4
ответ дан 27 November 2019 в 21:59
поделиться

ну, после множества исследований по этому поводу и нескольких попыток исправить время, когда

  1. люди входят в http://www.sitename.com и www .sitename.com в том же сообщении
  2. исправляет родительские ошибки вроде ( http://www.sitename.com ) и http://msdn.microsoft.com/en-us/ library / aa752574 (vs.85) .aspx
  3. длинные URL-адреса, например: http://www.amazon.com/gp/product/b000ads62g/ref=s9_simz_gw_s3_p74_t1?pf_rd_m=atvpdkikx0der&prd_rd_d_s 101 & pf_rd_p = 470938631 & pf_rd_i = 507846

сейчас мы используем это расширение HtmlHelper ... думал, что поделюсь и получу любые комментарии:

    private static Regex regExHttpLinks = new Regex(@"(?<=\()\b(https?://|www\.)[-A-Za-z0-9+&@#/%?=~_()|!:,.;]*[-A-Za-z0-9+&@#/%=~_()|](?=\))|(?<=(?<wrap>[=~|_#]))\b(https?://|www\.)[-A-Za-z0-9+&@#/%?=~_()|!:,.;]*[-A-Za-z0-9+&@#/%=~_()|](?=\k<wrap>)|\b(https?://|www\.)[-A-Za-z0-9+&@#/%?=~_()|!:,.;]*[-A-Za-z0-9+&@#/%=~_()|]", RegexOptions.Compiled | RegexOptions.IgnoreCase);

    public static string Format(this HtmlHelper htmlHelper, string html)
    {
        if (string.IsNullOrEmpty(html))
        {
            return html;
        }

        html = htmlHelper.Encode(html);
        html = html.Replace(Environment.NewLine, "<br />");

        // replace periods on numeric values that appear to be valid domain names
        var periodReplacement = "[[[replace:period]]]";
        html = Regex.Replace(html, @"(?<=\d)\.(?=\d)", periodReplacement);

        // create links for matches
        var linkMatches = regExHttpLinks.Matches(html);
        for (int i = 0; i < linkMatches.Count; i++)
        {
            var temp = linkMatches[i].ToString();

            if (!temp.Contains("://"))
            {
                temp = "http://" + temp;
            }

            html = html.Replace(linkMatches[i].ToString(), String.Format("<a href=\"{0}\" title=\"{0}\">{1}</a>", temp.Replace(".", periodReplacement).ToLower(), linkMatches[i].ToString().Replace(".", periodReplacement)));
        }

        // Clear out period replacement
        html = html.Replace(periodReplacement, ".");

        return html;
    }
11
ответ дан 27 November 2019 в 21:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: