我在另一篇文章中找到了这个regex
\b(\(*[CDEFGAB](?:b|bb)*(?:\+|#|##|dim|sus|maj|min|aug|m|M|°|[0-9])*[\(]?[\d\/]*[\)]?(?:[CDEFGAB](?:b|bb)*(?:#|##|dim|sus|maj|min|aug|m|M|°|[0-9])*[\d\/]*)*\)*)\b当我在preg_replace中使用它时,这个regex工作得很好,但是当它发现A# B# C# D# E# F# G# (后面没有m类似于G#m,在本例中G#m是工作得很好)。
例如,当我在F中使用regex时,下面的歌词将突出显示为G#m和preg_replace($regex, '<span class="_c">$1</span>', $lyrics)
F#
Angel eyes,
G#m
Why won’t you let me apologise?

我笨手笨脚的,不太擅长regex。任何帮助都将不胜感激。提前感谢
发布于 2021-12-24 15:10:15
您可以使用自适应动态词界
$lyrics = "F#\nAngel eyes,\nG#m\nWhy won’t you let me apologise?";
$regex = '/(?:\b(?=\w)|\B(?!\w))\(*\b[CDEFGAB](?:b|bb)*(?:\+|\#{1,2}|dim|sus|maj|min|aug|[mM°0-9])*\(?[\d\/]*\)?(?:[CDEFGAB](?:b|bb)*(?:\#{1,2}|dim|sus|maj|min|aug|[mM°0-9])*[\d\/]*)*\)*(?:\b(?<=\w)|\B(?<!\w))/';
echo preg_replace($regex, '<span class="_c">$1</span>', $lyrics)见regex演示。
原因是您的匹配可以从非单词字符开始或结束,而\b单词边界根据上下文的不同而不同。
在这里,我建议使用类型2的自适应动态单词边界:
(?:\b(?=\w)|\B(?!\w)) -一个左边框,如果下一个字符是单词char (\b(?=\w)),则确保当前位置位于单词边界,或者如果下一个字符不是单词char,则在非单词边界位置。(?:\b(?<=\w)|\B(?<!\w)) -一个右边框,如果前一个字符是一个单词字符,则确保当前位置位于单词边界,或者如果前一个字符不是一个单词字符,则在一个非单词边界位置。您还可以观看我的这段YT视频,提供更多关于自适应动态单词边界的说明和Python演示。
https://stackoverflow.com/questions/70473781
复制相似问题