2

我正在编写一个脚本,该脚本需要找到文本中某些字母(和弦)的匹配项,然后替换它们。

  1. 但也有一些例外。如果下一个“2”空格为空,则它们是匹配的。
  2. 如果只有一个空格,但第二个空格也包含一个符合上述规则的字母。

EX(匹配这些 A、Am、B、C#):文本是:

Am BA 飞机降落 C# B

在此示例中,(Am、B、C# 和 B)应该匹配但不是“A”平面。

我对字符串函数和正则表达式不太擅长任何帮助将不胜感激

我基本上是在尝试写一个转置器,但我主要担心的是它会选择错误的文本谢谢

4

2 回答 2

5

假设您无法控制输入(例如,您从指法网站上抓取这些),并且由于某种原因这些和弦在单词之间交错而不是在行之间休息,那么这是一个开始:

<?php

    $mods = '(?:maj|m|min|sus|add9|aug|dim|dom|...)';
    $regex = "/\b([ABCDEFG][#b]?$mods?)\s+/"

?>

但是,恐怕我不理解您的“下两个空格”限制。但是,如果您想区分和弦“A”和单词“A”,我建议您不要使用您的方法。相反,请考虑以下替代规则,尽管远非完美。“A”是唯一一个通常单独是一个词的和弦,所以如果你的歌词大写,“A”是一个词而不是和弦的暗示是下一个词是一个未大写的词:

    Am B A plane came down C# --> Am B C#

    Am B A Plane came down C# --> Am B A C#

如果您考虑一下,除了上下文线索之外,这也是人类可以分辨的方式。要使用此策略制作正则表达式,可以将单独的“A”视为一种特殊情况,如下所示。

<?php

    $mods = '(?:maj|m|min|sus|add9|aug|dim|dom|...)';
    $regex_1 = '((?:A(?!\s)|[BCDEFG])[#b]?$mods?)';
    $regex_2 = '(A(?=\s+[a-z]))';
    $regex = "/\b(?:$regex_1|$regex_2)\s+/";

?>

在此处查看正在运行的演示:http ://rubular.com/r/tRjozL7KCx 。

这远非完美,但您可以开始并改进。

更新:解释,帮助学习。

\b                      A word-boundary, so "A plane came down and CRASHED
                        into the sea" will not match "D" as a note.
(?:                     A non-capture group.  (Ignore this for now.)
    (                   A capture group.  (To encapsulate $regex_1.)
        (?:             A non-capture group.  (Ignore this for now.)
            A(?!\s)     An "A" not followed by whitespace, i.e. a "lone A".
            |           An "OR" operator.
            [BCDEFG]    Any one of these characters, B C D E F G.
        )
        [#b]            Any one of the characters, # b.
        ?               Says the previous entity (# or b) is optional.
        $mods           Any one of the modifiers, e.g. maj m min ...
        ?               Says the previous entity (maj m min ...) is optional.
    )

    |                   An "OR" operator.

    (                   A capture group.  (To encapsulate $regex_2.)
        A(?=\s+[a-z])   An "A" that is followed by at least one whitespace
                        character, then a lower-case letter.
    )
)
\s+                     A bunch of whitespace.
于 2012-06-18T14:52:40.617 回答
1

好吧,无论如何这里是转置和弦的课程仍然需要一些调整,但现在它适合我的需要。

PHP CHORD TRANSPOSER 类

它检测几乎所有可能的和弦并拾取内联和弦。如果您包含 Flats 和弦,它将转调为 flats 而不是升号,sharp 也是如此,默认为Sharp,因此 F Transpose by 1 是 F# 而不是 Gb

它还支持 PDF 创建,只需下载DOMPDF并取消注释包含和第 82-86 行并从 $html 变量中删除回显。

希望这会有所帮助,但它仍然远非完美,哈哈,但到目前为止它还没有错过任何和弦

用多首歌曲测试它并发布反馈错误等

于 2012-06-20T03:24:35.977 回答