Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Вытащить текст из фигурных скобок

Сообщения:  [1-10]   [11-19] 

 
 автор: Trianon   (10.01.2011 в 15:01)   письмо автору
 
   для: Quies   (08.01.2011 в 22:23)
 

регуляри регуляркам рознь.
Регулярка с жестким синтаксисом конечного автомата в шаблоне [^}]+}... отработает очень быстро, по сравнению с той же неопределенной [.]+} ...
А если еще и однократные маски применить - так и вообще мгновенно.
Тем более, что объем у Вас, в сущности, скромный.

Поработав некоторое время в регулярками, заметил три вещи, на которые частенько плюют, из-за чего инструмент становится торомозным и ресурсозатратным.
неопределенность в шаблоне (показал выше) , пренебрежение однократными подмасками (из-за чего системе приходится делать откаты назад там, где их можно избежать), пренебрежение расстановкой незахватывающих подмасок там, где не требуются обратные ссылки и получение данных (это приводит к созданию изрядного количества элементов массивов, отъедая лишнюю память и время).

  Ответить  
 
 автор: sim5   (10.01.2011 в 13:22)   письмо автору
 
   для: Quies   (08.01.2011 в 22:23)
 

Вы просто делаете таким образом лишнюю надстройку над уже готовым. Лично я не вижу никаких проблем по обработке массива. При этом ссылка (ниже), что длина массива может быть приличной, не может являться проблемой. Я не вижу в данном случае смысла записи массива в строку, чтобы потом получить опять массив.

  Ответить  
 
 автор: Quies   (08.01.2011 в 22:30)   письмо автору
 
   для: sim5   (08.01.2011 в 04:47)
 

Я не против массивов, как таковых. И знаю что в php есть богатый функционал по работе с ними.
Но для обработки форм его всё равно не достаточно (код получиться длинным и сложным для больших форм), так как в форму могут запихнуть недоброжелатели, какой угодно код.

  Ответить  
 
 автор: Quies   (08.01.2011 в 22:23)   письмо автору
 
   для: sim5   (08.01.2011 в 04:47)
 

А как быть с определением длинны строки?Да ещё со всеми остальными тесторами вроде проверки валидности email или телефона.
Явно быстрее записать:

emailtest: email, email2;
phonetest: phone;

Чем писать всё это на чистом php.

Скобки нужны чтоб отделить блоки разных массивов друг от друга(и не только массивов блоки могут быть разного назначения), и не возиться с настройками класса.
Тем более регулярок здесь по минимуму. Всё остальное можно разобрать стандартными функциями php.

  Ответить  
 
 автор: sim5   (08.01.2011 в 04:47)   письмо автору
 
   для: Quies   (08.01.2011 в 03:28)
 

Достаточно одного действия (функции пересечения массивов, без всякого цикла), чтобы узнать, что есть пустые поля и какие, и это заметьте без всяких скобок. От того, что к имени Вася добавить фигурные скобки, произносить это имя легче не станет, а вот лишнего добавится. Да и вы прописали не решение, из которого бы видно было, что вам помогли скобки, вы прописали желание свое.
Я могу сказать только одно - форма, это массив/массивы, а массив, это удобно, тем более, что существует богатый инструментарий работы с ним. Если вы "изуродовали" массив таким образом, что приходиться обращаться к таким затратным методам, как рег. выражения, то это уже плохо.

  Ответить  
 
 автор: Quies   (08.01.2011 в 03:35)   письмо автору
 
   для: sim5   (08.01.2011 в 02:41)
 

Ответил, сообщением выше.

  Ответить  
 
 автор: Quies   (08.01.2011 в 03:28)   письмо автору
 
   для: 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{
 
// РЕЗУЛЬТАТ УДАЧНЫЙ, ЗАНОСИМ В БД ИЛИ ЧТО ТО ДРУГОЕ
 
}

?>


Сравните объём кода.

Просто уже надоело возиться с тестированием данных больших форм, и писать повторяющейся непродуктивный код.

  Ответить  
 
 автор: sim5   (08.01.2011 в 02:41)   письмо автору
 
   для: Quies   (08.01.2011 в 02:36)
 

А самих ключей, что не хватает для ориентации?

  Ответить  
 
 автор: Quies   (08.01.2011 в 02:36)   письмо автору
 
   для: Trianon   (07.01.2011 в 08:55)
 

Да, именно так. В скобках не сами данные, а ключи управляющие ими.

  Ответить  
 
 автор: Quies   (08.01.2011 в 02:34)   письмо автору
 
   для: 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


)

  Ответить  

Сообщения:  [1-10]   [11-19] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования