2008-11-19 51 views
5

Soy terrible con expresiones regulares, pero he tenido una oportunidad y un Google (e incluso mirado en la fuente de reddit) y todavía estoy atascado así que aquí va:Bbcode expresiones regulares

Mi objetivo es hacer coincidir la siguiendo 'códigos' y reemplázalos con las etiquetas HTML. Es solo la expresión regular con la que estoy atrapado.

**bold text** 
_italic text_ 
~hyperlink~ 

Aquí está mi intento en la negrita uno:

^\*\*([.^\*]+)\*\*$ 

¿Alguien puede señalar por qué esto no está funcionando? Estoy usando la sintaxis preg.

Gracias

+0

¡Esto no es un código BB! – SaidbakR

Respuesta

4

uso:

\*\*(.[^*]*)\*\* 

explicación:

\*\*  // match two *'s 
(.  // match any character 
[^*]  // that is not a * 
*)  // continuation of any character 
\*\*  // match two *'s 

en una clase de caracteres "[]" "^" es significativa sólo si es el primer carácter. por lo que concuerda con algo (.*), (.[^*]*) es por nada hasta que literal *

edición: en respuesta a los comentarios para que coincida con asterisco dentro (es decir **bold *text**), que tendría que utilizar una lucha no codicioso:

\*\*(.*?)\*\* 

las clases de caracteres son las coincidencias no codiciosas más eficientes, pero no es posible agruparlas dentro de una clase de caracteres (see "Paréntesis y referencias posteriores ...")

+0

Esto no coincide con una cadena como esta: '¿Qué es ** 3 * 4 **?' solo porque tiene un asterisco. –

+0

Creo que quiere deshacerse del período aquí. Se trabajará para **, pero _ (. [^ _] *) _ __ _hi_ a su vez, en Hi_, no hi Mark

+0

Su primera respuesta no debe tener un punto, que coincidirá con el '* ** prueba ** '. –

3

Antes que nada, deshazte de^y $. Usar esos solo coincidirá con una cadena que comience con ** y termine con **. En segundo lugar, utilice el cuantificador codicioso para hacer coincidir el menor texto posible, en lugar de hacer una clase de caracteres para todos los caracteres que no sean asteriscos.

Esto es lo que sugiero:

\*\*(.+?)\*\* 
1
\*\*(.*?)\*\* 

que trabajará para el texto en negrita .

basta con sustituir el ** con _ ~ o para los demás

2

Aquí es otra expresión regular: \*\*((?:[^*]|\*(?!\*))*)\*\*

ejemplo en Perl:

my %tag2re = (b => <<'RE_BOLD', i => '_([^_]*)_'); 
    \*\*(  # begin bold 
    (?:[^*] # non-star 
    |  # or 
    \*(?!\*) # single star 
    )*  # zero or more times 
)\*\*  # end bold 
RE_BOLD 

my $text = <<BBCODE; 
before **bold and _italic_ *text 
2nd line** after _just 
      italic_ 
**** 
**tag _soup** as a result_ 
BBCODE 

while (my ($tag, $re) = each %tag2re) { 
    $text =~ s~$re~<$tag>$1</$tag>~gsx; 
} 
print $text; 

Imprime:

before <b>bold and <i>italic</i> *text 
2nd line</b> after <i>just 
      italic</i> 
<b></b> 
<b>tag <i>soup</b> as a result</i>

O como html:

before bold and italic *text 
2nd line after just 
      italic 
 
tag soup as a result

interpretación de Stackoverflow es:

antes audaz y cursiva * texto segunda línea de después simplemente cursiva


etiqueta sopa como resultado

+0

La mejor respuesta hasta el momento. –