Доброго времени суток коллеги) к сожалению с регулярными выражениями сталкивался крайне редко в своей практике, но вот была поставлена задача, получить некоторые данные, анализируя регулярное выражение, а именно: максимальная и минимальная длина строки, которая подходит под это регулярное выражение, и все символы, которые могут быть использованы в данной строке, порядок, "или", всё это не важно, только длины и всевозможные символы. Понимаю что задача нетривиальная, и никто за меня делать не будет, но может кто то знает опен сорсы, которые решают что то подобное, готовые функции, или другие готовые решения, которые я мог бы переделать, или уже использовать, заранее благодарен
видимо нужно с автором об этом пообщаться или использовать как сервис. там не только js, есть переключатель, для PHP переключи PCRE. Стоит подучить regex, чтобы не пропустить, то что нужно для решении задачи.
@reqyz, cдаётся мне, ты излагаешь свою интепретацию задания. А смысл уже потерялся. Давай буквально скопируй сюда текст задания, посмотрим что можно сделать.
задача именно такая, по регулярному выражению подобрать оптимально подходящий тип для поля в бд, тоесть, если регулярное выражения предполагает строки состоящие лишь из цифр, не начинающихся с нуля, которые могут иметь знак минуса в начале, и длина которых от нуля до двух, это тинуинт, строка длина которой от 30 до 50 символов, и которая может иметь любые символы, это варчар длиной 50 символов и т д, регулярки могут быть и более сложными, но функция должна всегда вычислять три значения ля начала, максимальная и минимальная длина, и входящие символы, я не прошу написать за меня, но может кто то знает исходные коды любых анализаторов?
Вот сейчас стало более понятно, imho. А то показалось, что анализировать надо само регулярное выражение. Оказалось, что анализировать надо таки данные, применяя регулярки. Я не припомню чтобы где-то видел такой анализ. Тут помоему только одна хитрость: если поле хоть раз было не-нумерик, значит оно не-нумерик. С min и max длиной очевидно должно быть просто накопление крайних значений.
Автор извини, у меня без регулярок, но это непринципиально. Для каждого отдельного $value анализ можно делать как с помощью регулярок, так и через Variable handling Functions. Для окончательного вывода важно как значения накапливаются. На выходе из цикла: Поле целочисленное только тогда, когда is_numeric == true и is_float == false Поле вещественное только тогда, когда is_numeric == true и is_float == true Поле строковое если is_numeric == false Код (PHP): <?php class Analizator { private $fields = []; private function doSingle($value) { $is_numeric = is_numeric($value); $is_float = $is_numeric && strpos($value, '.') !== false; // don't is_float()! $min_len = $max_len = mb_strlen($value); return compact('is_numeric', 'is_float', 'min_len', 'max_len'); } public function doRow($row) { foreach ($row as $key => $value) { $result = $this->doSingle($value); $this->fields[$key] = !isset($this->fields[$key]) ? $result : [ 'is_numeric' => $this->fields[$key]['is_numeric'] && $result['is_numeric'], 'is_float' => $this->fields[$key]['is_float'] || $result['is_float'], 'min_len' => min($this->fields[$key]['min_len'], $result['min_len']), 'max_len' => max($this->fields[$key]['max_len'], $result['max_len']), ]; } } public function result() { $result = []; foreach ($this->fields as $i => $f) { $type = 'VARCHAR'; if ($f['is_numeric'] && !$f['is_float']) { $type = $f['max_len'] <= 2 ? 'TINYINT' : 'INT'; } elseif ($f['is_numeric'] && $f['is_float']) { $type = 'FLOAT'; } $result[$i] = $type . '('. $f['max_len'] . ')'; } return $result; } } $analizator = new Analizator(); if (($handle = fopen('test.csv', 'r')) !== false) { while (($data = fgetcsv($handle, 1000, ',')) !== false) { $analizator->doRow($data); } fclose($handle); } var_export($analizator->result()); Для таких исходных данных Код (Text): 10, 10, 15, "120" 15, 10.2, "alfa beta", "120" 10, 120, 20, "102" 1, 10, 81, "100" 2, 86, 11, "120" -1, 10.2, 75.1, "112" будет получен такой результат: Код (Text): array ( 0 => 'TINYINT(2)', 1 => 'FLOAT(5)', 2 => 'VARCHAR(9)', 3 => 'INT(3)', )
спасибо, но я наверно очень плохой объясняльщик, анализируются именно регулярки, например входящий параметр = '^[a-zA-Z0-9_]{1,}$' и мы понимаем что минимальная длина строки 1 символ, максимальная - бесконечность, к тому же среди символов есть буквы, а значит оптимальный вариант для выбора типа поля, это текст, неограниченной дллины или вот: '([wx])([yz])' - тут очевидна что минимальное и максимальное количество символов = 2, символы включают в себя буквы, а значит оптимальный тип это варчар, длиной 2 символа, и т д т.о. анализируются именно регулярки, для выбора правильного типа в бд, при создании таблиц, регулярки могут быть и более сложными, то-есть их конструкция не ограниченна