2011-10-29 10 views
10

Considérese la siguiente entrada como un ejemplo:¿Cómo usaré Regex para analizar este esquema de acordes?

[Ami]Song lyrics herp derp [F]song lyrics continue 
[C7/B]Song lyrics continue on another [F#mi7/D]line 

necesito para analizar el anterior y el eco como el siguiente:

<div class="chord">Ami</div>Song lyrics herp derp <div class="chord">F</div>song lyrics continue 
<div class="chord">C7/B</div>Song lyrics continue on another <div class="chord">F#mi7/D</div>line 

Así que, básicamente, necesito:

1) cambie [ a <div class="chord">,

2) a continuación, agregue el contenido de los corchetes,

3) luego cambie ] a </div>.

... utilizando PHP 5.3+.

Respuesta

10

Esto funcionará.

$tab = "[Ami]Song lyrics herp derp [F]song lyrics continue 
[C7/B]Song lyrics continue on another [F#mi7/D]line"; 

echo str_replace(
    array('[', ']'), 
    array('<div class="chord">','</div>'), 
    $tab 
); 
+0

Parece una buena solución, me pregunto por qué no pensé en eso antes. ¿Es más rápido/mejor que la expresión regular? –

+1

@RiMMER: Ambos deberían ser de tiempo lineal, pero esta solución probablemente sea más rápida porque hay menos sobrecarga. Tan divertido como regex es que no siempre son la respuesta correcta en la práctica :) – Cam

+0

Bueno, definitivamente esta parece la mejor solución, pero esperaré a que otros voten antes de aceptar algo, espero que esté bien con todos :) –

0

tratar

echo preg_replace('#\\[([^]]*)\\]#','<div class="chord">$1</div>',$string); 

Cuidado con código html o malformados [] s en su cadena de entrada embargo,

0

Patrón

\[(.*?)\] 

Reemplazar con

<div class="chord">$1</div> 

Como usará todos los regex, debe tener cuidado con los pares bad [], y si la letra podría contener de alguna manera [entonces querrá escaparse correctamente de eso.

2
$result = preg_replace('/\[(.*?)\]/', '<div class="chord">\1</div>', $subject); 

# \[(.*?)\] 
# 
# Match the character “[” literally «\[» 
# Match the regular expression below and capture its match into backreference number 1 «(.*?)» 
# Match any single character that is not a line break character «.*?» 
#  Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?» 
# Match the character “]” literally «\]» 
Cuestiones relacionadas