PHP preg_match: шаблон, который удовлетворяет всем именам полей MySQL (включая формирования 'table.field')

0

Мне нужен шаблон, который удовлетворяет именам полей mysql, но также и с возможностью иметь имя таблицы перед ним

примеры:

mytable.myfield
myfield
my4732894__7289FiEld

вот что я пробовал:

$pattern = "/^[a-zA-Z0-9_]*?[\.[a-zA-Z0-9_]]?$/";

это сработало для того, что мне было нужно раньше, это было просто имя поля:

$pattern = "/^[a-zA-Z0-9_]*$/";

любые идеи, почему мое добавление не работает?

Возможно, я создаю регулярное выражение, поэтому я объясню, что я добавил... первый '?' заключается в том, что он не жадный, т.е. он остановится, если следующая часть, а именно "[. [a-zA-Z0-9_]]?" выполняется. теперь эта вторая часть такая же, как и первая, за исключением того, что она необязательна (отсюда и "?" в конце), и начинается с периода (следовательно, "[." и "]" завертывает мое старое предложение. и, очевидно, "^" и "$" отражают начало и конец строки

так... любые идеи?

(также, я немного растерялся относительно того, почему мне нужно вставлять эти "/" в начале/конце в любом случае, поэтому, если бы вы могли сказать мне, почему это требуется, это было бы потрясающе)

Большое спасибо! (и спасибо за прочтение всего этого, если вы на самом деле сделали это... довольно скачкообразно)

  • 0
    Обратите внимание, что ? соответствует одному символу максимум. Вы, вероятно, хотите использовать + .
  • 0
    Вы собираетесь поддерживать `CRAZY-NAM3$`.`like@this?`
Теги:
preg-match

2 ответа

2
Лучший ответ

[...] используется для построения класса символов. Используйте (?:...) для группировки.

BTW, \w эквивалентно [a-zA-Z0-9_], поэтому

$pattern = "/^\\w+(?:\\.\\w+)?$/"

Обратите внимание, что я также заменил *? на +. Поскольку \w никогда не будет соответствовать a ., поэтому нежелательное сопоставление не требуется (*?*). Но я не думаю, что .field должен быть действительным, поэтому вместо * следует использовать +.

1

Имена полей (и имена таблиц) могут содержать почти любой символ. Имена только имен полей не поддерживают NULL (0x00) и конечные пробелы. Названия таблиц (и имена db) немного более ограничены тем, что они также не могут иметь /, \ или .... Единственное требование состоит в том, чтобы вы обменивали идентификаторы с котировками "`" backtick. Если идентификатор содержит обратную сторону, выведите его с другой ссылкой...

http://dev.mysql.com/doc/refman/5.0/en/identifiers.html

Ещё вопросы

Сообщество Overcoder
Наверх
Меню