首先,是一个简短的示例,假设我有此/[0-9]{2}°/
RegEx和此文本“ 24º”。文本不匹配,很明显...(?)确实取决于字体。
[这里是我的问题,我无法控制用户使用哪个字符,因此,我需要涵盖正则表达式/[0-9]{2}[°º]/
中的所有可能,甚至更好,确保文本仅包含我期望的字符°
。但是我不能只是删除未知字符,否则正则表达式将无法正常工作,我需要将其更改为看起来像我期望的字符。我通过一个将“外观”映射为“我期望”并进行更改的小函数来完成此操作,问题是,我没有涵盖所有可能性,例如,今天我找到了一个新的-
,现在我们有三个,就像Latex = D-
--
---
,cool,但是正则表达式不起作用。
有人知道我该怎么解决吗?
无法在正则表达式中包含具有“类似外观”的字符,因此基本上您不能。
对于特定字符,您可能对Unicode规范很幸运,Unicode规范可能列出了一些最常见的错误,但并不能保证。对于度数符号,Unicode代码表列出了四个相似的字符(\ u02da,\ u030a,\ u2070和\ u2218),但不是您有问题的字符,即男性序数指示符。
不幸的是不在PHP中。 ASP.NET具有覆盖此类内容的unicode字符类,但是如您所见here,:So覆盖了太多内容。同样因为它不是PHP仍然无法解决问题。 :)
在PHP中,您将只能选择最常用的字符集并使用它们。
这应该有助于:http://unicode.org/charts/charindex.html
只有一个度数符号。使用看起来相似的东西是不正确的。也有华氏度和摄氏度的符号。不幸的是,有许多减号。
您的正则表达式确实需要列出您要接受的所有字符。如果您事先不知道字符串的编码,则可以使用PHP中的/ u修饰符将正则表达式指定为UTF-8:"/[0-9]{2}[°º]/u"
然后可以在字符类中包含所有要接受的Unicode字符。 。在使用正则表达式之前,您还需要将主题字符串转换为UTF-8。
[好吧,如果您想降低温度,则可能需要首先更改一些内容。
温度可以是1到3位数字,因此[0-9]{1,3}
(如果有人还活着放入4位数字的温度,那么我们注定要命!)对您来说可能更准确。
现在,学位标志是您发现的棘手部分。如果您无法控制用户(更可惜),您可以直接拉紧接下来的内容吗?
[0-9]{1,3}.
您可能需要增强第一部分,尽管要进行一些位置处理,例如字符串的开头或结尾。
您也可以排除所有不需要的常规字符。
[0-9]{1,3}[^a-zA-Z]
将拾取所有标点符号(尽管只有一个)。