如何在preg_match_all中创建模式字符串

时间:2015-05-17 14:20:12

标签: php regex preg-match preg-match-all

如何为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

2 个答案:

答案 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)

one-liner

\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})?))?)

及其小提琴:https://regex101.com/r/vW9sJ2/7