php - проверьте на допустимый гуид

Одна часть загадки:

/**
 * Determines if a form is dirty by comparing the current value of each element
 * with its default value.
 *
 * @param {Form} form the form to be checked.
 * @return {Boolean} true if the form is dirty, false
 *                   otherwise.
 */
function formIsDirty(form) {
  for (var i = 0; i < form.elements.length; i++) {
    var element = form.elements[i];
    var type = element.type;
    if (type == "checkbox" || type == "radio") {
      if (element.checked != element.defaultChecked) {
        return true;
      }
    }
    else if (type == "hidden" || type == "password" ||
             type == "text" || type == "textarea") {
      if (element.value != element.defaultValue) {
        return true;
      }
    }
    else if (type == "select-one" || type == "select-multiple") {
      for (var j = 0; j < element.options.length; j++) {
        if (element.options[j].selected !=
            element.options[j].defaultSelected) {
          return true;
        }
      }
    }
  }
  return false;
}

И другой :

window.onbeforeunload = function(e) {
  e = e || window.event;  
  if (formIsDirty(document.forms["someForm"])) {
    // For IE and Firefox
    if (e) {
      e.returnValue = "You have unsaved changes.";
    }
    // For Safari
    return "You have unsaved changes.";
  }
};

Оборачивают все это, и что Вы получаете?

var confirmExitIfModified = (function() {
  function formIsDirty(form) {
    // ...as above
  }

  return function(form, message) {
    window.onbeforeunload = function(e) {
      e = e || window.event;
      if (formIsDirty(document.forms[form])) {
        // For IE and Firefox
        if (e) {
          e.returnValue = message;
        }
        // For Safari
        return message;
      }
    };
  };
})();

confirmExitIfModified("someForm", "You have unsaved changes.");

Вы, вероятно, также захотите изменить регистрацию beforeunload обработчик событий для использования LIBRARY_OF_CHOICE регистрация события.

22
задан Svetlozar Angelov 16 January 2010 в 09:20
поделиться

2 ответа

Учитывая, что GUID определяется примерно так: "A98C5A1E-A742-4808-96FA-6F409E799937" (из чего на странице википедии написано)

Я полагаю, можно было бы использовать такое регулярное выражение:

$guid = 'A98C5A1E-A742-4808-96FA-6F409E799937';
if (preg_match('/^\{?[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}\}?$/', $guid)) {
  var_dump('ok');
} else {
  var_dump('not ok');
}

Оно будет соответствовать

  • 8 символам (как буквам, так и цифрам)
  • 4 символа
  • 4 символа
  • 4 символа
  • 12 символов

Каждый набор символов разделен символом ' - '


Учитывая, что вы используете com_create_guid , проверку регулярного выражения на наличие дополнительных параметров } и { вокруг guid, что означает, что это тоже будет отображать "ОК":

$guid = '{A98C5A1E-A742-4808-96FA-6F409E799937}';
if (preg_match('/^\{?[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}\}?$/', $guid)) {
  var_dump('ok');
} else {
  var_dump('not ok');
}
31
ответ дан 29 November 2019 в 03:36
поделиться

Есть несколько правил, которые должны быть наложены на шаблон UUID / GUID.

  • Единственными допустимыми буквами являются a, b, c, d, e и f.
  • 0-9 можно заменить шаблоном цифр \ d
  • GUID часто нечувствительны к регистру.
  • У вас либо есть {обе скобки}, либо их нет вообще.

Упрощенные шаблоны

  • хххххххх- hhhh-hhhh-hhhh-hhhhhhhhhhhhh
  • {hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhhh}

Выражение:

var_dump(
preg_match("/^(\{)?[a-f\d]{8}(-[a-f\d]{4}){4}[a-f\d]{8}(?(1)\})$/i", $guid)
? "ok", "not ok");

Перевод:

  1. / начало

    начало

    ^

    начало

    строка

  2. (\ {)? необязательная открывающая скобка {
  3. [af \ d] {8} 8 шестнадцатеричных символов hhhhhhhh
  4. (- [af \ d] {4}) 4 шестнадцатеричных символа, начинающихся с тире -hhhh
  5. { 4} предыдущий шаблон повторяется 4 раза
  6. [af \ d] {8} 8 шестнадцатеричных символов hhhhhhhh
  7. (? (1) \}) если был первый шаблон {, то сопоставить закрывающий тег}
  8. $ конец строки
  9. / закрыть выражение
  10. i игнорировать регистр
39
ответ дан 29 November 2019 в 03:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: