为什么这个正则表达式在PHP中不起作用?

3

我需要匹配(不区分大小写)“abcd”和一个可选的商标符号。

正则表达式:/abcd(™)?/gi

请看示例:

preg_match("/abcd(™)?/gi","AbCd™  U9+",$matches);
print_r($matches);

当我运行这个代码时,$matches 没有被填充任何内容......甚至没有创建一个空数组。有什么想法吗?
4个回答

5

你的文件采用何种编码方式?PHP在处理Unicode时存在问题。在你的情况下,建议使用转义序列\x99代替直接嵌入TM符号。


3
注意: 我不是PHP专家。然而,这似乎是一个有关字符编码的问题。例如,您的PHP文件可能被编码为win-1252(其中™被编码为\x99),而您正在尝试匹配的数据可能被编码为UTF-8(其中™被编码为\xe2\x84\xa2),或者反之亦然(即您的文件是UTF-8,而您的数据是win-1252)。尝试朝这个方向寻找答案,并提供更多关于您正在做什么的信息。

我并不介意失去声望或“被选中”的答案状态。我只是想提醒大家,“赞/踩”意味着“对问题有帮助/没有帮助”,而不是“我喜欢/不喜欢你的回答”或类似的意思。当你踩别人的回答时,请留下评论说明原因,这是正确的做法。 - tzot

2
我怀疑这与文字商标符号有关。
你可能想了解如何在正则表达式中使用Unicode,然后嵌入商标符号的转义序列。

2

这是多种因素的结合……以下是最终可行的正则表达式:

/abcd(\xe2\x84\xa2)?/i

我不得不移除/g修饰符并将商标符号更改为\xe2\x84\xa2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接