正则表达式,编码和类似的字符

问题描述 投票:2回答:5

首先,是一个简短的示例,假设我有此/[0-9]{2}°/ RegEx和此文本“ 24º”。文本不匹配,很明显...(?)确实取决于字体。

[这里是我的问题,我无法控制用户使用哪个字符,因此,我需要涵盖正则表达式/[0-9]{2}[°º]/中的所有可能,甚至更好,确保文本仅包含我期望的字符°。但是我不能只是删除未知字符,否则正则表达式将无法正常工作,我需要将其更改为看起来像我期望的字符。我通过一个将“外观”映射为“我期望”并进行更改的小函数来完成此操作,问题是,我没有涵盖所有可能性,例如,今天我找到了一个新的-,现在我们有三个,就像Latex = D--- ---,cool,但是正则表达式不起作用。

有人知道我该怎么解决吗?

php regex encoding special-characters
5个回答
2
投票

无法在正则表达式中包含具有“类似外观”的字符,因此基本上您不能。

对于特定字符,您可能对Unicode规范很幸运,Unicode规范可能列出了一些最常见的错误,但并不能保证。对于度数符号,Unicode代码表列出了四个相似的字符(\ u02da,\ u030a,\ u2070和\ u2218),但不是您有问题的字符,即男性序数指示符。


2
投票

不幸的是不在PHP中。 ASP.NET具有覆盖此类内容的unicode字符类,但是如您所见here,:So覆盖了太多内容。同样因为它不是PHP仍然无法解决问题。 :)

在PHP中,您将只能选择最常用的字符集并使用它们。

这应该有助于:http://unicode.org/charts/charindex.html

只有一个度数符号。使用看起来相似的东西是不正确的。也有华氏度和摄氏度的符号。不幸的是,有许多减号。


1
投票

您的正则表达式确实需要列出您要接受的所有字符。如果您事先不知道字符串的编码,则可以使用PHP中的/ u修饰符将正则表达式指定为UTF-8:"/[0-9]{2}[°º]/u"然后可以在字符类中包含所有要接受的Unicode字符。 。在使用正则表达式之前,您还需要将主题字符串转换为UTF-8。



0
投票

[好吧,如果您想降低温度,则可能需要首先更改一些内容。

温度可以是1到3位数字,因此[0-9]{1,3}(如果有人还活着放入4位数字的温度,那么我们注定要命!)对您来说可能更准确。

现在,学位标志是您发现的棘手部分。如果您无法控制用户(更可惜),您可以直接拉紧接下来的内容吗?

[0-9]{1,3}.

您可能需要增强第一部分,尽管要进行一些位置处理,例如字符串的开头或结尾。

您也可以排除所有不需要的常规字符。

[0-9]{1,3}[^a-zA-Z]

将拾取所有标点符号(尽管只有一个)。

© www.soinside.com 2019 - 2024. All rights reserved.