在以下语句中,一个空格来自用户的输入(我从远程Rails控制台(ActiveRecord字段)复制了用户的字符,并粘贴了它),另一个空格来自我的键盘。语句返回false
:
$sql = "SELECT AwayTeam, SUM(FTHG < FTAG) AS Wins,
SUM(FTHG = FTAG) AS Draws, SUM(FTHG > FTAG) AS Losses
FROM (SELECT * FROM fixtures WHERE AwayTeam = '$ATeam' ORDER BY id DESC LIMIT 10)
GROUP BY AwayTeam";
关于为什么/如何发生的任何想法?
答案 0 :(得分:5)
要验证用户输入的空白,不应使用==
和/或include?
助手。一个人应该使用现代的正则表达式,即匹配对象空格。
仅供参考:UTF-8规范中有十多个空格字符,包括但不限于:
spaces = {
space_medium_mathematical_space: " ",
spaces_em_quad: " ",
spaces_em_space: " ",
spaces_en_quad: " ",
spaces_en_space: " ",
spaces_figure_space: " ",
spaces_four_per_em_space: " ",
spaces_hair_space: " ",
spaces_punctuation_space: " ",
spaces_six_per_em_space: " ",
spaces_thin_space: " ",
spaces_three_per_em_space: " "
}
要匹配它们,可以使用\p{Space}
匹配器。
spaces.values.map { |s| s == ' ' }
#⇒ [false, false, false, false, false, false,
# false, false, false, false, false, false]
但是:
spaces.values.map(&/\A\p{Space}*\z/.method(:match?))
#⇒ [true, true, true, true, true, true,
# true, true, true, true, true, true]
答案 1 :(得分:1)
我相信您可以利用String#unicode_normalize。它具有几种规范化形式,已在unicode.org中进行了说明。似乎:nfkc
和:nfkd
符合此目的。
s = "foo bar" # <-- includes a non breaking space
space = " " # <-- regular space
s.include?(space) # => false
s.unicode_normalize(:nfkc).include?(space) # => true