如何为preg_match_all()
函数创建一个模式字符串如果我有多个匹配的字符串,如"G,C,D"
& "A,B,C"
& "E,C,D"
目前我的字符串是
$str = "/(?<=\b)([CDEFGAB](?:b|bb|m)*(?:#|##|sus|maj|min|aug)*[\d\/]*(?:[CDEFGAB](?:b|bb|m)*(?:#|##|sus|maj|min|aug)*[\d\/]*)*)(?=\s|$|(<.*>))(?! \w)/"
preg_match_all($str,$lyrics , $output_array);
我想在("G,C,D" & "A,B,C" & "E,C,D")
字符串中添加这些组合$str
。
答案 0 :(得分:1)
以下a way与您的 G,C,D 类似的字符串相匹配:
\b
(?:(?:[CDEFGAB]
(?:b|bb|m)*
(?:\#|\#\#|sus|maj|min|aug)*
[\d\/]*
(?:[CDEFGAB]
(?:b|bb|m)*
(?:\#|\#\#|sus|maj|min|aug)*
[\d\/]*
)*
),?)+
(?=\s|$|(?:<.*>))
(?![[:blank:]]\w)
\b(?:(?:[CDEFGAB](?:b|bb|m)*(?:\#|\#\#|sus|maj|min|aug)*[\d\/]*(?:[CDEFGAB](?:b|bb|m)*(?:\#|\#\#|sus|maj|min|aug)*[\d\/]*)*),?)+(?=\s|$|(?:<.*>))(?![[:blank:]]\w)
答案 1 :(得分:1)
注意这个答案已经过一段时间的精心编辑,以便得出最终结论。
参考这个网站:http://www.all-guitar-chords.com/我提出了这个正则表达式:
\b(?:G,C,D|A,B,C|E,C,D)|(?:[ABCDEFG](?:#|b)?)(?:\/[ABCDEFG]b)?(?:(?:(?:maj|min|sus|add|aug|dim)(?:\d{0,2}(?:#\d{1,2}|sus\d)?)?)|(?:m\d{0,2}(?:(?:maj|add|#)\d{0,2})?)|(?:-?\d{0,2}(?:\([^)]*\)|#\d{1,2})?))?)
<?php preg_match_all( '`' . $reg_exp . '`', $str, $matches ); ?>
我的最后一个表达式没有捕获任何反向引用。因此,$matches[0]
将是匹配数组(因为零索引数组始终是与完整表达式匹配的完整字符串的数组,后续数组将引用反向引用,如果有的话)。
它的编写尽可能精确,但这个表达式仍然可以返回误报,尽管不太可能。
唯一的另一种方法是使用您感兴趣的每个可能和弦的数组。然后迭代该数组显式搜索每个字符串 - 这仍然容易出现误报。
这是一个修补它的网站:https://regex101.com/r/vW9sJ2/7
注意 OP的原始问题是如何将某些字符串组合添加到表达式中,例如&#34; G,C,D&#34;或&#34; A,B,C&#34; (OP给出的例子)。然而,我采访过的音乐家表示他们无法看到如何提取和弦组合会有所帮助,因为有太多的变化。他们甚至不确定如何提取这样的和弦会有所帮助。这让我对OP打算用什么感到好奇,我希望他能为我解释一下(特别是看看我花了多少时间在这上面,考虑到我的痴迷性质,哈哈)。
编辑没有来自OP的回复,不确定这是否满足了OP的需求,并且我开始怀疑他是否需要更灵活的组合匹配(例如:G,光盘)。所以我修改了表达式来处理:
\b(?:[ABCDEFG],[ABCDEFG],[ABCDEFG])\b|(?:[ABCDEFG](?:#|b)?)(?:\/[ABCDEFG]b)?(?:(?:(?:maj|min|sus|add|aug|dim)(?:\d{0,2}(?:#\d{1,2}|sus\d)?)?)|(?:m\d{0,2}(?:(?:maj|add|#)\d{0,2})?)|(?:-?\d{0,2}(?:\([^)]*\)|#\d{1,2})?))?)