我正在编写一个脚本,需要在文本中找到某些字母(和弦)的匹配项,然后替换它们。
EX(匹配这些A,Am,B,C#):文字是:
上午B 一架飞机降落在C#B
在这个例子中,(Am,B,C#和B)应该匹配而不是“A”平面。
我对字符串函数和正则表达式不是很好,任何帮助都会非常感激
我基本上试图写一个转座器,但我主要担心的是它会选择错误的文字谢谢
答案 0 :(得分: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.
答案 1 :(得分:1)
好吧无论如何这里转换和弦的课程仍然需要一些调整但是现在它适合我的需要。
它可以检测几乎任何可能的和弦并拾取内联和弦。 如果你包括Flats和弦,它将转换为平底板而不是锐利,同样适用于锋利的, 默认值是清晰的,因此F Transpose by 1是F#而不是Gb
它还支持PDF创建,只需下载DOMPDF并取消注释include和第82-86行,并从$ html变量中删除回声。
希望这会有所帮助,但它仍然远非完美大声笑但它至今没有错过任何和弦
使用多首歌曲测试并发布反馈错误等