2011-10-29 11 views
10

Rozważmy następujący wejście jako przykład:Jak używać wyrażenia regularnego do analizowania tego schematu akordów?

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

muszę przeanalizować powyższe i echo go jak następuje:

<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 

Więc w zasadzie muszę:

1) zmień [ na <div class="chord">,

2) następnie dołącz zawartość nawiasów,

3) następnie zmień ] na </div>.

... za pomocą PHP 5.3+.

Odpowiedz

10

To zadziała.

$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

To wygląda jak schludne rozwiązanie, zastanawiam się, dlaczego wcześniej o tym nie myślałem. Czy jest szybszy/lepszy niż regex? –

+1

@RiMerER: Powinny one być liniowe, ale to rozwiązanie będzie prawdopodobnie szybsze, ponieważ jest mniej narzutów. Równie zabawne jak regexy są, że nie zawsze są one poprawną odpowiedzią w praktyce :) – Cam

+0

To zdecydowanie wygląda na najlepsze rozwiązanie, ale poczekam, aż inni zagłosują, zanim cokolwiek zaakceptuję, mam nadzieję, że wszystko w porządku :) –

0

spróbować

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

Strzeż kodu html lub zniekształconych [] w twoich ciągu wejściowego chociaż,

0

Wzór

\[(.*?)\] 

Wymień

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

Podobnie jak w przypadku wszystkich wyrażeń regularnych, chcesz zachować ostrożność przy złych parach [] i jeśli liryczny może w jakiś sposób zawierać [wtedy będziesz chciał to odpowiednio uciec.

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 «\]» 
Powiązane problemy