|
|
|
| Есть код (планирую сделать небольшой язык запросов)
@GET{ЛОРолрлоЛОРЛЛБ}
@FILE{
GFGHFGHFG4359840
KLEJTR09
E50943T
}
@GET{
dfg54t4 fddgfd
}
@POST {ЖЖДЛЖ}
@GET{
ty65465656 fddgdfgd
}
|
из него необходимо вытащите все данные которые находятся в скобках с @GET , остальной текст игнорировать.
В виде массива то есть должно получиться, нечто вроде этого на выходе (вывод)
Array{
[1]=>ЛОРолрлоЛОРЛЛБ
[2]=>dfg54t4 fddgfd
[3]=>ty65465656 fddgdfgd
}
|
Пробовал составить рег. выражение, но не пойму как вытащить все блоки @GET
<?
$text = "
@GET{ЛОРолрлоЛОРЛЛБ}
@FILE{
GFGHFGHFG4359840
KLEJTR09
E50943T
}
@GET{
dfg54t4 fddgfd
}
@POST {ЖЖДЛЖ}
@GET{
ty65465656 fddgdfgd
}
";
eregi ("@GET\{(.+)\}", $text, $regs);
print_r($regs);
?>
|
в случае одного @GET работает правильно, но если их много делит весь текст на 2 части. | |
|
|
|
|
|
|
|
для: Quies
(07.01.2011 в 00:09)
| | $_GET, $_POST, $_FILES, это уже массивы, к чему городить к ним скобки, дабы в последствии мудрить с ними? | |
|
|
|
|
|
|
|
для: sim5
(07.01.2011 в 00:49)
| | Это для примера @GET можно заменить на какой нибудь @TESTBLOCK
Вообще этот разбор нужен для класса, который в последствии будет работать с данными формы и не только.
Смысл в том что обработку больших форм, можно будет сделать в несколько строк кода.
Как закончу эту работу постараюсь дать ссылку на класс.
Но это в перспективе, сейчас интересует, как всё же вытащить данные из блоков. | |
|
|
|
|
|
|
|
для: Quies
(07.01.2011 в 03:35)
| | И зачем для это скобки? Формы, это массив/массивы данных и для работы с ними в РНР предостаточно готовых и удобных инструментов. Для чего изобратетать никчемный велосипед? | |
|
|
|
|
|
|
|
для: sim5
(07.01.2011 в 06:28)
| | Это точно не велосипед, дело не в массивах, а в самом процессе обработки формы.
Недостаточно просто вытащить данные, их ещё нужно протестировать, отфильтровать всякий ненужный и хакерский код и занести в бд после этого, или не занести и вывести ошибки.
Если элементов форм 3,4 писать обработчик недолго, но если их довольно много, лишнего рутинного кода дофига и готовых решений я пока не нашёл, а то что есть мне не нравится.
И вообще честно говоря раздражает когда, что то пытаешься сделать новое, сразу ссылаются на "Велосипед".
Новое это хорошо забытое старое, а не некое абстрактное "новое" появившееся само собой.
Естественно в мотоцикле есть черты велосипеда, но мотоцикл далеко не велосипед, так-же и со всем остальным включая программный код.
Тем не менее мы отошли от темы. | |
|
|
|
|
|
|
|
для: Quies
(07.01.2011 в 07:23)
| | Вы можете объяснить почему для того чтобы получить данные из формы, протестировать, отфильтровать и т.д., эти данные нужно запихивать в фигурные скобки? Что это дает? Я понимаю, если бы вы получали эти данные посредством AJAX в JSON формате, куда нишло, но опять таки, перед тем как их использовать они преобразуются простым методом без всяких рег. выражений.
Вот что меня интересует, это я назвываю велосипедом, а не попытку написать обработчик. | |
|
|
|
|
|
|
|
для: sim5
(07.01.2011 в 08:48)
| | Я так понял, что автор помещает в фигурные скобки не данные из формы, а ключи к ним - имена полей. | |
|
|
|
|
|
|
|
для: Trianon
(07.01.2011 в 08:55)
| | Зачем, имя (ключ) и без скобок тоже получить можно. Я ни как не могу понять для чего вообще они нужны, их назначение. Ради того чтобы потом рег. выражениями ковырятся. | |
|
|
|
|
|
|
|
для: sim5
(07.01.2011 в 10:18)
| | Хорошо. Объясню на примере.
Допустим нам нужно принять некоторые данные из формы и протестировать их.
Пусть это будет title, text, phone, email, contacts, icq, skype, city, country, name, firsname, gender
Тестировать будем на пустоту полей, и длину поля (вообще обычно требуется больше различных тостеров, но пока ограничимся этим).
Причём на пустоту полей нужно протестировать только title, text, phone, email, city, country, name, firsname, gender
а, на длину поля только title, text, phone, email, contacts
Как это будет на стандартном php:
<?php
if(empty($_POST["title"]) || empty($_POST["text"]) || empty($_POST[" phone"]) ||
empty($_POST["email"]) || empty($_POST["city"]) || empty($_POST["country"]) ||
empty($_POST["name"]) || empty($_POST[" firsname"]) || empty($_POST["gender"]) ||
strlen($_POST["title"])>30 || strlen($_POST["text"])>40 || strlen($_POST["phone"])>50 ||
strlen($_POST["email"])>20 || strlen($_POST["contacts"])>50){
// ВЫВОДИМ ФОРМУ ПОВТОРНО
// ВЫВОДИМ ОШИБКИ
if(empty($_POST["title"])) echo "Поле 'Заголовок' пустое!";
if(empty($_POST["text"])) echo "Поле 'Описание' пустое!";
if(empty($_POST["phone"])) echo "Поле Телефон' пустое!";
if(empty($_POST["email"])) echo "Поле 'e-mail' пустое!";
if(empty($_POST["city"])) echo "Поле 'Город' пустое!";
if(empty($_POST["country"])) echo "Поле 'Страна' пустое!";
if(empty($_POST["name"])) echo "Поле 'Имя' пустое!";
if(empty($_POST[" firsname"])) echo "Поле 'Фамилия' пустое!";
if(empty($_POST["gender"])) echo "Поле 'Пол' пустое!";
if(strlen($_POST["title"])>30) echo "Поле 'Заголовок' не должно привышать 30 символов!";
if(strlen($_POST["text"])>40) echo "Поле 'Описание' не должно привышать 40 символов!";
if(strlen($_POST["phone"])>50)echo "Поле Телефон' не должно привышать 50 символов!";
if(strlen($_POST["email"])>20) echo "Поле 'e-mail' не должно привышать 20 символов!";
if(strlen($_POST["contacts"])>50) echo "Поле 'Контакты' не должно привышать 50 символов!";
} else {
// РЕЗУЛЬТАТ УДАЧНЫЙ, ЗАНОСИМ В БД ИЛИ ЧТО ТО ДРУГОЕ
}
?>
|
Можно попытаться оптимизировать при помощи циклов, но более менее короткий код получиться если нужно проверить все поля на пустоту и на длинну поля.
Но, если поля не все тестировать, да ещё у тестеров разные параметры(как в примере с длинной строки).
Придёться возиться с отсевом ненужных полей, да ещё и для каждой новой формы изобритать свой цикл отсева.
Переизбыток кода очевиден.
Как я хочу сделать (синтексис пока не окончательный, но примерно в этом духе будет)
<?php
$code="
@POST{
empty: title, text, phone, email, city, country, name, firsname, gender;
maxlen: title[30], text[40], phone[50], email[20], contacts[50];
}
";
$script = new ClassName;
$script->text=$code;
if($script-> start()){
// ВЫВОДИМ ФОРМУ ПОВТОРНО
// ВЫВОДИМ ОШИБКИ
$script-> errors();
} else{
// РЕЗУЛЬТАТ УДАЧНЫЙ, ЗАНОСИМ В БД ИЛИ ЧТО ТО ДРУГОЕ
}
?>
|
Сравните объём кода.
Просто уже надоело возиться с тестированием данных больших форм, и писать повторяющейся непродуктивный код. | |
|
|
|
|
|
|
|
для: Quies
(08.01.2011 в 03:28)
| | Достаточно одного действия (функции пересечения массивов, без всякого цикла), чтобы узнать, что есть пустые поля и какие, и это заметьте без всяких скобок. От того, что к имени Вася добавить фигурные скобки, произносить это имя легче не станет, а вот лишнего добавится. Да и вы прописали не решение, из которого бы видно было, что вам помогли скобки, вы прописали желание свое.
Я могу сказать только одно - форма, это массив/массивы, а массив, это удобно, тем более, что существует богатый инструментарий работы с ним. Если вы "изуродовали" массив таким образом, что приходиться обращаться к таким затратным методам, как рег. выражения, то это уже плохо. | |
|
|
|
|
|
|
|
для: sim5
(08.01.2011 в 04:47)
| | А как быть с определением длинны строки?Да ещё со всеми остальными тесторами вроде проверки валидности email или телефона.
Явно быстрее записать:
emailtest: email, email2;
phonetest: phone;
|
Чем писать всё это на чистом php.
Скобки нужны чтоб отделить блоки разных массивов друг от друга(и не только массивов блоки могут быть разного назначения), и не возиться с настройками класса.
Тем более регулярок здесь по минимуму. Всё остальное можно разобрать стандартными функциями php. | |
|
|
|
|
|
|
|
для: Quies
(08.01.2011 в 22:23)
| | Вы просто делаете таким образом лишнюю надстройку над уже готовым. Лично я не вижу никаких проблем по обработке массива. При этом ссылка (ниже), что длина массива может быть приличной, не может являться проблемой. Я не вижу в данном случае смысла записи массива в строку, чтобы потом получить опять массив. | |
|
|
|
|
|
|
|
для: Quies
(08.01.2011 в 22:23)
| | регуляри регуляркам рознь.
Регулярка с жестким синтаксисом конечного автомата в шаблоне [^}]+}... отработает очень быстро, по сравнению с той же неопределенной [.]+} ...
А если еще и однократные маски применить - так и вообще мгновенно.
Тем более, что объем у Вас, в сущности, скромный.
Поработав некоторое время в регулярками, заметил три вещи, на которые частенько плюют, из-за чего инструмент становится торомозным и ресурсозатратным.
неопределенность в шаблоне (показал выше) , пренебрежение однократными подмасками (из-за чего системе приходится делать откаты назад там, где их можно избежать), пренебрежение расстановкой незахватывающих подмасок там, где не требуются обратные ссылки и получение данных (это приводит к созданию изрядного количества элементов массивов, отъедая лишнюю память и время). | |
|
|
|
|
|
|
|
для: sim5
(08.01.2011 в 04:47)
| | Я не против массивов, как таковых. И знаю что в php есть богатый функционал по работе с ними.
Но для обработки форм его всё равно не достаточно (код получиться длинным и сложным для больших форм), так как в форму могут запихнуть недоброжелатели, какой угодно код. | |
|
|
|
|
|
|
|
для: Trianon
(07.01.2011 в 08:55)
| | Да, именно так. В скобках не сами данные, а ключи управляющие ими. | |
|
|
|
|
|
|
|
для: Quies
(08.01.2011 в 02:36)
| | А самих ключей, что не хватает для ориентации? | |
|
|
|
|
|
|
|
для: sim5
(08.01.2011 в 02:41)
| | Ответил, сообщением выше. | |
|
|
|
|
|
|
|
для: Quies
(07.01.2011 в 00:09)
| | eregi стоило бы поменять на preg_match_all
придется поиграть модификаторами шаблона, чтобы несколько строк воспринимались, как одна.
Ну и как обычно .+ поменять на как минимум [^}]+ | |
|
|
|
|
|
|
|
для: Trianon
(07.01.2011 в 08:19)
| | Спасибо. Как раз то что нужно.
Этот код заработал:
<?php
$text = "
@GET{
ЛОРолрлоЛОРЛЛБ
GFGHFGHFG4359840
KLEJTR09
E50943T
}
@FILE{
GFGHFGHFG4359840
KLEJTR09
E50943T
}
@GET{
dfg54t4 fddgfd
}
@POST {ЖЖДЛЖ}
@GET{
ty65465656 fddgdfgd
GFGHFGHFG4359840
KLEJTR09
E50943T
}
";
preg_match_all ("|@GET\{([^}]+)|i", $text, $regs);
print_r($regs[1]);
?>
|
Выводит:
Array
(
[0] =>
ЛОРолрлоЛОРЛЛБ
GFGHFGHFG4359840
KLEJTR09
E50943T
[1] =>
dfg54t4 fddgfd
[2] =>
ty65465656 fddgdfgd
GFGHFGHFG4359840
KLEJTR09
E50943T
)
|
| |
|
|
|
|