¿Alguien tiene algún buen código C# (y expresiones regulares) que analizará una cadena y "enlazará" las URL que puedan estar en la cadena?Código de C# para vincular URL en una cadena
Respuesta
Es una tarea bastante simple que puede acheive con Regex y una lista para ir expresión regular a partir de:
Algo así como:
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>");
Usted también puede estar interesado no solo en crear enlaces sino también en acortar URL. Aquí es un buen artículo sobre este tema:
Véase también:
- Regular Expression Workbench en MSDN
- Converting a URL into a Link in C# Using Regular Expressions
- Regex to find URL within text and make them as link
- Regex.Replace Method en MSDN
- The Problem With URLs por Jeff Atwood
- Parsing URLs with Regular Expressions and the Regex Object
- Format URLs in string to HTML Links in C#
- Automatically hyperlink URL and Email in ASP.NET Pages with C#
Hola. Gran respuesta. La mayoría de las sugerencias en su publicación (y enlaces) parecen funcionar, pero todas parecen romper cualquier enlace existente en el texto que se evalúa. –
VSmith puede probar diferentes expresiones de reg de regixlib.com y encontrar cuál funciona mejor para usted. –
@VSmith: ¿Quiere dar a entender que tiene una cadena como "hola there, consulte: http://www.b.com"; y solo quieres vincular el segundo? –
No es tan fácil como se puede leer en este blog post by Jeff Atwood. Es especialmente difícil detectar dónde termina una URL.
Por ejemplo, es la parte trasera paréntesis de la URL o no:
- http : //en.wikipedia.org/wiki/PCTools (CentralPointSoftware)
- una URL entre paréntesis (http : //en.wikipedia.org) más texto
En el primer caso, los paréntesis son parte de la URL. En el segundo caso, ¡no lo son!
Y como puede ver en las URL enlazadas en esta respuesta, no todo el mundo lo hace bien :) – Ray
Bueno, de hecho, no quería que las dos URL se vinculen. Pero parece que esto no es compatible. – M4N
La expresión regular de Jeff parece mostrar mal en mi navegador, creo que debería ser: "\ (? \ Bhttp: // [-A-Za-z0-9 + & @ # /%? = ~ _() | !: ,.;] * [- A-Za-z0-9 + & @ # /% = ~ _() |] " –
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(" ", " ");
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;
}
Saludos por publicarlo :) –
Terminamos usando algo muy similar, con una modificación. Terminamos asegurándonos de que el reemplazo solo ocurra una vez. Esto significa que terminaremos perdiendo algunos enlaces (enlaces que ocurren más de una vez) pero elimina la posibilidad de enlaces ilegibles en dos casos: 1) Cuando hay dos enlaces donde uno es más detallado que el otro. p. "http://google.com http://google.com/reader" 2) Cuando hay una combinación de enlaces HTML con enlaces de texto sin formato. p. "Http://google.com Google" si (input.IndexOf (match.Value) == input.LastIndexOf (match.Value)) { ... } –
así, después de un gran trabajo de investigación sobre este tema, y varios intentos de solucionar momentos en
- personas entran en http://www.sitename.com y www.sitename.com en el mismo puesto
- correcciones para parenthisis como (http://www.sitename.com) y http://msdn.microsoft.com/en-us/library/aa752574(vs.85).aspx
- URL largas como: http://www.amazon.com/gp/product/b000ads62g/ref=s9_simz_gw_s3_p74_t1?pf_rd_m=atvpdkikx0der&pf_rd_s=center-2&pf_rd_r=04eezfszazqzs8xfm9yd&pf_rd_t=101&pf_rd_p=470938631&pf_rd_i=507846
ahora estamos usando esta extensión HtmlHelper ...pensé que iba a compartir y obtener cualquier comentario:
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;
}
has encontrado siguiente expresión regular http://daringfireball.net/2010/07/improved_regex_for_matching_urls
para mí se ve muy bien. La solución de Jeff Atwood no maneja muchos casos. josefresno me parece manejar todos los casos. Pero cuando intenté entenderlo (en caso de alguna solicitud de soporte) mi cerebro se hirvió.
hay clase:
public class TextLink
{
#region Properties
public const string BeginPattern = "((http|https)://)?(www.)?";
public const string MiddlePattern = @"([a-z0-9\-]*\.)+[a-z]+(:[0-9]+)?";
public const string EndPattern = @"(/\S*)?";
public static string Pattern { get { return BeginPattern + MiddlePattern + EndPattern; } }
public static string ExactPattern { get { return string.Format("^{0}$", Pattern); } }
public string OriginalInput { get; private set; }
public bool Valid { get; private set; }
private bool _isHttps;
private string _readyLink;
#endregion
#region Constructor
public TextLink(string input)
{
this.OriginalInput = input;
var text = Regex.Replace(input, @"(^\s)|(\s$)", "", RegexOptions.IgnoreCase);
Valid = Regex.IsMatch(text, ExactPattern);
if (Valid)
{
_isHttps = Regex.IsMatch(text, "^https:", RegexOptions.IgnoreCase);
// clear begin:
_readyLink = Regex.Replace(text, BeginPattern, "", RegexOptions.IgnoreCase);
// HTTPS
if (_isHttps)
{
_readyLink = "https://www." + _readyLink;
}
// Default
else
{
_readyLink = "http://www." + _readyLink;
}
}
}
#endregion
#region Methods
public override string ToString()
{
return _readyLink;
}
#endregion
}
lo uso en este método:
public static string ReplaceUrls(string input)
{
var result = Regex.Replace(input.ToSafeString(), TextLink.Pattern, match =>
{
var textLink = new TextLink(match.Value);
return textLink.Valid ?
string.Format("<a href=\"{0}\" target=\"_blank\">{1}</a>", textLink, textLink.OriginalInput) :
textLink.OriginalInput;
});
return result;
}
casos de prueba:
[TestMethod]
public void RegexUtil_TextLink_Parsing()
{
Assert.IsTrue(new TextLink("smthing.com").Valid);
Assert.IsTrue(new TextLink("www.smthing.com/").Valid);
Assert.IsTrue(new TextLink("http://smthing.com").Valid);
Assert.IsTrue(new TextLink("http://www.smthing.com").Valid);
Assert.IsTrue(new TextLink("http://www.smthing.com/").Valid);
Assert.IsTrue(new TextLink("http://www.smthing.com/publisher").Valid);
// port
Assert.IsTrue(new TextLink("http://www.smthing.com:80").Valid);
Assert.IsTrue(new TextLink("http://www.smthing.com:80/").Valid);
// https
Assert.IsTrue(new TextLink("https://smthing.com").Valid);
Assert.IsFalse(new TextLink("").Valid);
Assert.IsFalse(new TextLink("smthing.com.").Valid);
Assert.IsFalse(new TextLink("smthing.com-").Valid);
}
[TestMethod]
public void RegexUtil_TextLink_ToString()
{
// default
Assert.AreEqual("http://www.smthing.com", new TextLink("smthing.com").ToString());
Assert.AreEqual("http://www.smthing.com", new TextLink("http://www.smthing.com").ToString());
Assert.AreEqual("http://www.smthing.com/", new TextLink("smthing.com/").ToString());
Assert.AreEqual("https://www.smthing.com", new TextLink("https://www.smthing.com").ToString());
}
Esto funciona bien, sin embargo, coincide con el cosas como o.context u otra cadena que tenga un punto en ellas. Sería bueno forzar .com/.org/.net, etc, en algún lugar de la cadena –
También obliga a www, que no siempre es el caso. –
- 1. Cómo vincular STL en código de C++?
- 2. ¿Vincular a una URL externa en Javadoc?
- 3. cadena de acortamiento C# para url
- 4. Cifrado de una cadena a una URL en C#
- 5. Objetivo-C: buscar una URL dentro de una cadena
- 6. Obtiene una URL de una cadena
- 7. Descargar archivo de URL a una cadena
- 8. regex para URL incluyendo cadena de consulta
- 9. g ++ vinculando la dependencia de orden al vincular el código c con el código C++
- 10. Obtención de XCode para incluir, compilar y vincular código base existente (C++) en XCode 4.3 (.1)
- 11. Buscar url de una cadena con php
- 12. Buen código para formatear una cadena xml
- 13. Pasar una cadena al código C en Android NDK
- 14. ¿Cómo devolver una cadena en mi código C?
- 15. ¿Cómo puedo compilar y vincular código C++ con código C compilado?
- 16. Una forma de vincular a una clase, un método, especialmente una línea de código específica en el comentario de C#
- 17. ¿Cómo vincular a una biblioteca estática en C?
- 18. Inicialice una cadena en C para vaciar la cadena
- 19. extraer cadena de consulta de una cadena de URL
- 20. Crear URL a partir de una cadena
- 21. compruebe si una cadena es una URL
- 22. Ubuntu: Cómo vincular un código binario
- 23. cómo vincular archivos de encabezado en C++
- 24. una cadena en C
- 25. ¿La forma más fácil de convertir una URL a un hipervínculo en una cadena C#?
- 26. ¿Cómo obtener una cadena json desde url?
- 27. Generar URL en MVC de código subyacente
- 28. Invocar una URL - C#
- 29. ¿Cómo puedo escapar una URL de una cadena en Rails?
- 30. ¿Cómo se analiza una url de una cadena en Android?
Esta parece ser la pregunta con la canónica de expresiones regulares de base solución. Tal vez alguien podría editar el título para ayudar a los buscadores a encontrarlo. – JasonSmith