RegEx para despojar etiquetas BBCode de una cuerda
Pregunta
Estoy trabajando en una función que utiliza el JQuery MarkItUp! editor como editor de BBCode. Sólo estoy permitiendo que un pequeño subconjunto de BBCode incluyendo los siguientes:
[b]
[i]
[quote]
[quote=Mr Incredible]
[img]
[url]
[youtube]
Tengo un campo de 1.500 caracteres "Descripción" que utiliza el editor, pero también estoy planeando para almacenar un carácter 150 digerir de la descripción con todo el BBCode quitó.
Actualmente estoy usando un simple expresión regular para hacer esto en C #. Básicamente armas nucleares incrustado BBCode en una cadena, pero deja tras de sí una gran cantidad de "contenido ruidoso" como el [img] URL o el [youtube] ID de vídeo que también me gustaría eliminar de la digestión.
Aquí está mi RegEx actual:
public static String StripBBCode(string bbCode)
{
string r = Regex.Replace(bbCode,
@"\[(.*?)\]",
String.Empty, RegexOptions.IgnoreCase);
// Finally, replace all newlines with a space
r = Regex.Replace(r,
@"(\r\n|\n\r|\r|\n)+",
@" ", RegexOptions.IgnoreCase);
return r;
}
Si funciono con la siguiente cadena a través de esta función, aparece el resultado que se muestra a continuación:
fuente
This is [b]bold[/b]. This is [i]italic[/i].
Here is an image:
[img]http://www.phatmac.com/Pics/Movies/Incredibles.jpg[/img]
Here is a link to [url=http://espn.go.com]ESPN[/url].
Here is a YouTube video:
[youtube]WJ0UkZ3W4FA[/youtube]
resultado
Esto es negrita. Esto está en cursiva. Aquí está una imagen: http://www.phatmac.com/Pics/Movies/Incredibles. jpg Aquí hay un enlace a ESPN. Aquí hay un video de YouTube: WJ0UkZ3W4FA
Esto es lo que yo quiero volver
Esto es negrita. Esto está en cursiva. Aquí está una imagen: Aquí hay un enlace a ESPN. Aquí hay un video de YouTube:
¿Cómo puedo modificar mi función StripBBCode () para lograr esto?
EDITADO
La sugerencia de David continuación en la primera respuesta era correcta.
Esto es lo que estoy usando ahora:
string r = Regex.Replace(s,
@"\[youtube\].*\[\/youtube\]",
String.Empty, RegexOptions.IgnoreCase);
r = Regex.Replace(r,
@"\[img\].*\[\/img\]",
String.Empty, RegexOptions.IgnoreCase);
Solución
Usted tiene varias etiquetas que desea que el contenido eliminado, y el resto en el que sólo desea que las etiquetas retirados.
Do sustituir de [img].*[/img]
con String.Empty y [youtube].*[/youtube]
, y todo lo que necesita el contenido eliminado, a continuación, hacer su eliminación de [.*]
.
Editar:
No soy un experto en expresiones regulares tampoco, pero creo @"\[img\].*?\[/img\]"
es lo que quiere. No creo que necesita los paréntesis en @"\[(.*?)\]"
, creo que en este contexto paréntesis medios para guardar el texto que coincide con lo que puede coincidir de nuevo con \1
.