regex syntax validator w JS

0

Heja

Czy spotkaliście się z jakimś prostym validatorem składni regexa? Chciałbym go umieścić przy formularzu, gdzie ludzie dodają regułki, a niekoniecznie są mistrzami fachu. Chodzi o to, by później automat tego używający nie siał ostrzeżeniami.

Fajnie, gdyby validator umiał podpowiedzieć gdzie znalazł błąd niż tylko zwracał "błąd" lub "ok".

0

Może głupia odpowiedź: a tak nie można sprawdzić?

try {
  /regex/.test("a");
}
catch(e) {
  // e = błąd 
}
0

Nawet nie trzeba używać .test. Wystarczy utworzyć obiekt regex za pomocą literału lub konstruktora (w tym wypadku zapewne użyjesz konstruktora). Gdy wyrażenie regularne będzie niepoprawne, zostanie rzucony wyjątek.

Zdawać by się mogło, że to tylko binarna odpowiedź: poprawnie/niepoprawne. Na szczęście jest lepiej! Rzucony wyjątek ma pole message przechowujące komunikat o błędzie. Mówi on (choć krótko i lakonicznie) o rodzaju błędu. Można sobie to odwzorować na jakiś bardziej rozsądny komunikat w odpowiednim języku (polecam wykorzystać nie switcha, tylko mapę).

try {
  /regex/;
} catch (e) {
  alert(e.message);
}
0

Niestety, FF pluje błędem w konsoli, IE8 wywala swój błąd - nie trafia do catch i nie jest odpalany ten alert.

ha, ale tak już działa:

try {
  new RegExp('regex**');
} catch (e) {
  alert(e.message);
}

(znalezione tutaj)

nie jest to może szczyt techniki, ale lepsze niż nic - dzięki za hint!

0

@Marooned:
Miałem reinstalkę systemu i sprawdziłem tylko na IE6. Ale tu wszystko jest OK. Instaluję IE8 (i patche). Jak uda mi się stworzyć działający kod, to dam Ci cały kod przykładowej strony.

Zauważyłem już, że pewnym problemem jest to, że różne przeglądarki wyświetlają różne komunikaty o błędach. Więc jakbyś chciał dorobić odwzorowanie komunikatów na bardziej przyjazne, to musiałoby to działać na zasadzie wiele-do-jednego :/.

0

(Drugi post pod rząd, żeby było widać)

Udało mi się wreszcie zainstalować wszelkie instalki i napisać naprędce kompletny przykład prostej walidacji używającej konstruktora RegExp. Działa w Fx 3.6, Operze 10.5 i IE 8:

<!DOCTYPE html>
<html>
<head lang="pl">
  <meta charset="utf-8">
  <title>4programmers.net: regex syntax validator w JS</title>
  <script>

function RegexValidator() {
  var _customExceptionMessageMap = {
        'unterminated parenthetical': 'niedomknięty nawias [to nie jest domyślny komunikat przeglądarki!]'
      }
  ;

  this.validate = function(regexString) {
    try {
      new RegExp(regexString);
      alert('OK! Wyrażenie regularne wygląda na poprawne!');
    } catch (e) {
      alert('Podane wyrażenie regularne jest niepoprawne.\n' + getExceptionDetails(e));
    }
  };

  function getExceptionDetails(e) {
    var customExceptionMessage = getCustomExceptionMessage(e.message);
    if (customExceptionMessage) {
      return 'Przyczyna błędu: ' + customExceptionMessage;
    } else {
      return '(brak szczegółów)';
    }
  }
  
  function getCustomExceptionMessage(message) {
    return _customExceptionMessageMap[message] || message;
  }
}

window.onload = function() {
  var regexInput       = document.getElementById('regex')
  ,   checkRegexButton = document.getElementById('check_regex')
  ,   validator        = new RegexValidator()
  ;
  checkRegexButton.onclick = validateEnteredRegex;

  regexInput.onkeypress = function(evt) {
    evt = fixEvent(evt);

    if (wasEnterKeyPressed()) {
      validateEnteredRegex();
      evt.preventDefault(); // enter would trigger checkRegexButton.click in IE
    }

    function wasEnterKeyPressed() {
      var ENTER_KEY_CODE = 13;
      return (evt.keyCode || evt.charCode) === ENTER_KEY_CODE;
    }
  };

  function validateEnteredRegex() {
    validator.validate(regexInput.value);
    regexInput.focus();
  }

  function fixEvent(evt) {
    fixedEvent = evt || window.event;
    if (!fixedEvent.preventDefault) {
      fixedEvent.preventDefault = function() {
        this.returnValue = false;
      };
    }
    return fixedEvent;
  }
};

  </script>
</head>
<body>
  <input type="text" id="regex">
  <input type="submit" id="check_regex" value="Sprawdź wyrażenie regularne">
</body>
</html>

edit: Cholera, napisałem ten przykład bez sprawdzenia tego tematu. Twój update posta nie uczynił tematu nie przeczytanym :/. No cóż.

Dodam jeszcze jedną rzecz. Nie wiem, w czym te regexy chcesz wykorzystać. Jeśli chcesz w JavaScripcie sprawdzić regexy, które będą potem używane przez PHP (!), to nie jest to najdokładniejsze rozwiązanie. PHP implementuje PCRE, bardzo dobre regexy oparte o Perlowe. Regexy z JavaScriptu są dużo słabsze. Konstruktor JS może więc nie rozpoznać pewnych wyrażeń regularnych legalnych w PHP -- spanikuje i rzuci wyjątkiem. W takim wypadku można użyć Ajaxa i walidować regexa po stronie serwera.

0

Hmm, słuszna uwaga - tak, to są regexy do PCRE.. hmm..

1 użytkowników online, w tym zalogowanych: 0, gości: 1