как удалить пробел, но не символ utf-8 в ruby

#ruby #regex #unicode #utf-8 #whitespace

#ruby #регулярное выражение #юникод #utf-8 #пробелы

Вопрос:

Я хочу запретить пользователям писать пустой комментарий (пробелы, amp;nbsp; и т.д.). Поэтому я применяю следующее:

 var.gsub(/^s |s z|s*amp;nbsp;s*/.'')
  

Однако затем умный пользователь находит пробел, используя символы юникода 302 или 240 , поэтому я также отфильтровал эти символы.

Затем я столкнулся с проблемой, поскольку я ввел поддержку нескольких языков, тогда слово like Déjà vu становится ошибкой. потому что часть à символа содержит 240 . есть ли какой-либо способ удалить пробелы, но оставить латинские символы нетронутыми?

Ответ №1:

Способ обойти это — использовать iconv для удаления недопустимых символов юникода (например, 230 сами по себе) перед использованием вашего регулярного выражения для удаления пробелов:

 require 'iconv'

var1 = "Déjà vu"
var2 = "240"

ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')
valid1 = ic.iconv(var1) # => "D303251j303240 vu" 
valid2 = ic.iconv(var2) # => ""
  

Комментарии:

1. Очевидным преимуществом использования уже разработанной библиотеки, такой как iconv, является то, что вам не нужно самостоятельно находить все угловые варианты (не то чтобы iconv по определению идеален, но, скорее всего, он будет лучше того, что любой может собрать самостоятельно).