Наскоро преминах към Rails 4 и сигурносттаизискванията вече не позволяват използването на регулярни изрази в стила на /^..$/. Грешката гласи, че вместо това регулярните изрази трябва да бъдат написани в стил /A..z/. Извършването на тази промяна изглежда решава всички мои проблеми с валидирането от страна на сървъра, но за съжаление наруши и всички мои проверки от страна на клиента в javascript.
Един прост пример. Искам да проверя потребителско име, което да бъде букви, цифри или точки.
Старият регулярен израз изглеждаше като /^[0-9a-zA-Z.]+$/ и работеше както от страна на сървъра (Rails 3.x), така и от страна на клиента
new RegExp( /^[0-9a-zA-Z.]+$/ ).test("myuser.name") = true
Новият регулярен израз изглежда като /A[0-9a-zA-Z.]+z/ и работи от страна на сървъра, но се проваля от страна на клиента
new RegExp( /A[0-9a-zA-Z.]+z/ ).test("myser.name") = false
Така че очевидно правя нещо нередно, но изглежда не мога да намеря обяснения. Проверих дали A..z са валидни регулярни изрази, за да се уверя, че това не е някакъв хак, специфичен за Rails, и изглежда е легитимен.
Някакви идеи?
Отговори:
5 за отговор № 1JavaScript не поддържа A
или z
в него RegExp
.
Ето някои сурови данни, първо за JavaScript:
var a = "hellonworld"
(/^world/).test(a) // false
(/^world/m).test(a) // true
(/hello$/).test(a) // false
(/hello$/m).test(a) // true
След това, за рубин:
a = "hellonworld"
a.match(/^world/) # => #<MatchData "world">
a.match(/Aworld/) # => nil
a.match(/hello$/) # => #<MatchData "hello">
a.match(/helloz/) # => nil
От това виждаме онзи рубинен "s A
и z
са еквивалентни на JavaScript ^
и $
стига да не използвате многоредова линия m
модификатор. Ако сте загрижени за входа, съдържащ няколко реда, просто ще трябва да преведете вашите регулярни изрази между тези два езика по отношение на тези съвпадащи символи.