使用preg_replace替换和弦而不是合唱和桥接

时间:2011-02-25 01:39:26

标签: php preg-replace

我有一些看起来像这样的文字:

[Verse 1]
[B]This is a song with chords [D]and lyrics
Blah [Am7+9d]blah blah [C]blah blah

[Verse 2]
This [C]is the verse
This is the [G]verse

[Chorus]
This is [E#]the Chorus
This is the Chorus

[Bridge]
This is [F]the bridge
This is [Am]the bridge

我想将所有的和弦([A],[Am],[A#],[B],[C]等)一直替换为[G],所以我可以只显示歌词。

这是我目前的代码几乎可以运作:

$line = preg_replace('~\[([A-G].*?)\]~', '', $line);

这可以完成,但它会删除[Chorus]和[Bridge],因为它们以C和B开头。

如何使其完美运行但不删除[Chorus]和[Bridge]?

2 个答案:

答案 0 :(得分:4)

$line = preg_replace('~\[(?!Chorus|Bridge)[A-G].*?\]~', '', $line);

答案 1 :(得分:0)

一种不同的(更通用的)解决方案,基于对从所提供的文本片段派生的数据的假设。

if (preg_match("/^\[[^\[\]]*\]$/", $line) === 0)
    $line = preg_replace("/\[.*\]/", "", $line);