PHP替换精确字符串(带#字符)

时间:2012-04-21 12:44:23

标签: php replace

我要做的是用另一种字体颜色版本代替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 /方法似乎不起作用。

2 个答案:

答案 0 :(得分: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);

更新:如果您想制作能识别许多不同和弦的正则表达式,请使用alternation

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

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

答案 1 :(得分:1)

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

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

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

http://ideone.com/iQ6P8