0

我想做的是用另一个字体颜色版本替换 A#, A#m,...,如下所示:

preg_replace('/\bA#m\b/','<span style="color:#910202;">A#m</span></a>',$content);
preg_replace('/\bA#\b/','<span style="color:#910202;">A#</span></a>',$content);

不幸的是,如果 A#m 是输入,它只会设置 A# 部分的样式。有什么帮助吗?/\b...\b/ 方法似乎不起作用。

4

2 回答 2

4

正则表达式工作得很好。问题是第二个也会匹配第一个的结果!

如果您传入A#m,第一个正则表达式会将其更改为

<span style="color:#910202;">A#m</span></a>

(顺便说一句,这不是一个有效的 HTML 片段;那是</a>做什么的?)

这将成为第二个正则表达式的输入。那一个会看到A#,替换它,最终结果将是

<span style="color:#910202;"><span style="color:#910202;">A#</span></a>m</span></a>

可能不是你所期望的。

一种解决方案是将两个表达式简单地合并为一个:

preg_replace('/\b(A#m?)\b/','<span style="color:#910202;">$1</span></a>',$content);

更新:如果您想创建一个识别许多不同和弦的正则表达式,请使用交替

preg_replace('/\b(A#(maj7|sus2|sus4)?)\b/',
             '<span style="color:#910202;">$1</span>',
             $content);

简短说明(A#(maj7|sus2|sus4)?)以便您可以对其进行扩展:此正则表达式A#单独匹配或可选匹配(由于) ?后跟(由于s )、、、。我不知道和弦的所有选项是什么,但是阅读我链接到的参考/教程是个好主意。只学习基础知识会给你很大的使用能力。|maj7sus2sus4

于 2012-04-21T12:50:36.197 回答
1

这个简单的正则表达式就可以了。

preg_replace('/A#(m?)/','<span style="color:#910202;">A#\\1</span></a>',$content);

这里的主要思想是,如果它后面跟着m我们m在替换字符串中添加。

http://ideone.com/iQ6P8

于 2012-04-21T13:14:25.783 回答