Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Регулярные выражения, поиск присутствующего и отсутствующего т 
:(
    Опции темы
SIMarOK
Дата 1.11.2012, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 25.10.2004

Репутация: нет
Всего: нет



Здравствуйте!, застрял с регуляркой

Есть группа чисел и букв:
1 и qwe
2 и rty
3 и uio
4 и pas

необходимо чтобы при присутствии букв группы присутствовала и ее цифра

поиск идет по буквам, т.е. если допустим присутствует буква q то должна присуствуовать цифра этой группы, т.е. 1

пример кода который работает не так как надо

Код

   $pattern = "qwy"; // здесь могут быть буквы всех групп, а так же и числа

if(preg_match("/^[^1][qwe]?+$/", $pattern )) // т.е. если присутствуют буквы группы и отсутвует ее цифра, то добавляем ее
$pattern .="1";

if(preg_match("/^[^2][rty]?+$/", $pattern ))
$pattern .="2";

if(preg_match("/^[^3][uio]?+$/", $pattern ))
$lovenow .="3";

if(preg_match("/^[^4][pas]?+$/", $pattern ))
$pattern .="4";


выводится qwy2, а должно поидее qwy12 т.к. присустсвуют буквы из двух групп

Прошу помощи любящих регулярки smile 

Это сообщение отредактировал(а) SIMarOK - 1.11.2012, 20:32
PM MAIL   Вверх
skyboy
Дата 1.11.2012, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



не понятно.
приведи пример: 
что на входе → что на выходе
а то пока не понятно, почему qwy2 → qwy12, а не qwy112
PM MAIL   Вверх
SIMarOK
Дата 1.11.2012, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 25.10.2004

Репутация: нет
Всего: нет



К примеру,

На входе q на выходе q1 (условие выполняется и добавляется в конец цифра группы)
qwe → qwe1 (условие выполняется и добавляется в конец цифра группы) 
1qwe → 1qwe (условие НЕ выполняется, т.к. цифра группы уже присутствует)

qwru → qwru123
1es → 1es4 (цифра(1) одной группы уже присутствовала ,поэтому добавилась только цифра 4ой группы)

Это сообщение отредактировал(а) SIMarOK - 1.11.2012, 21:16
PM MAIL   Вверх
skyboy
Дата 1.11.2012, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



а как ты 12 от 1 и 2 отличать будешь?
PM MAIL   Вверх
SIMarOK
Дата 2.11.2012, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 25.10.2004

Репутация: нет
Всего: нет



Цитата(skyboy @ 1.11.2012,  23:58)
а как ты 12 от 1 и 2 отличать будешь?

Эта переменная разбирается по-символьно, в ней нет парных элементов

Вопрос сейчас в регулярном выражении, у меня с ними проблема, не дружу

Это сообщение отредактировал(а) SIMarOK - 2.11.2012, 10:51
PM MAIL   Вверх
ksnk
Дата 2.11.2012, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Регулярка для проверки корректности или для корректироваки неправильного? 

Для проверки подойдет такая регулярка для первой группы
Код

preg_match('/1.*[qwe]|[qwe].*1/',string);



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
SIMarOK
Дата 2.11.2012, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 25.10.2004

Репутация: нет
Всего: нет



Цитата(ksnk @ 2.11.2012,  10:52)
Регулярка для проверки корректности или для корректироваки неправильного? 

Для проверки подойдет такая регулярка для первой группы
Код

preg_match('/1.*[qwe]|[qwe].*1/',string);

Код

   $string = "qy";

if(preg_match("/1.*[qwe]|[qwe].*1/", $string ))
$string .="1";

if(preg_match("/2.*[rty]|[rty].*2/", $string ))
$string .="2";

echo $string ;


Выводит qy, а должен выводить qy12, т.к. присустсвуют буквы из первой и второй группы.

Регулярка нужна для поиска. Если для вышеупомянутой задачи можно использовать другие функции, более простые, то я только за:)

Это сообщение отредактировал(а) SIMarOK - 2.11.2012, 11:11
PM MAIL   Вверх
Aliance
Дата 2.11.2012, 11:35 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Я бы вообще сделал без регулярок. Представляем строку как массив, пробегаемся для каждой буквы и записываем соотв. ей цифру. в доп. массив. Дальше делаем array_unique, implode и дописываем в конец строки. Примерный алгоритм такой, в целом конечно посложнее, нужны проверки и прочее.
При таком подходе не будет захардкодено все в if`ы.
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 2.11.2012, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(ksnk @  2.11.2012,  10:52 Найти цитируемый пост)
Для проверки

Код

   $string = "qy";
if(!preg_match("/1.*[qwe]|[qwe].*1/", $string ))
$string .="1";
if(!preg_match("/2.*[rty]|[rty].*2/", $string ))
$string .="2";
echo $string ;


?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
SIMarOK
Дата 2.11.2012, 11:54 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 25.10.2004

Репутация: нет
Всего: нет



Цитата(Aliance @ 2.11.2012,  11:35)
Я бы вообще сделал без регулярок. Представляем строку как массив, пробегаемся для каждой буквы и записываем соотв. ей цифру. в доп. массив. Дальше делаем array_unique, implode и дописываем в конец строки. Примерный алгоритм такой, в целом конечно посложнее, нужны проверки и прочее.
При таком подходе не будет захардкодено все в if`ы.

Мне кажется такой метод создаст большую нагрузку чем  вариант с регулярками

Добавлено @ 11:57
Цитата(ksnk @ 2.11.2012,  11:53)
Цитата(ksnk @  2.11.2012,  10:52 Найти цитируемый пост)
Для проверки

Код

   $string = "qy";
if(!preg_match("/1.*[qwe]|[qwe].*1/", $string ))
$string .="1";
if(!preg_match("/2.*[rty]|[rty].*2/", $string ))
$string .="2";
echo $string ;


?

Работает не верно, при входящей "q" выводит "q12", а поидее должен "q1" т.к. присутствует только первая группа

Это сообщение отредактировал(а) SIMarOK - 2.11.2012, 11:59
PM MAIL   Вверх
ksnk
Дата 2.11.2012, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Код

$string = "q";
preg_match("/1.*[qwe]|[qwe].*1|([qwe])/", $string,$m);
if(!empty($m[1]))$string .="1";

preg_match("/2.*[rty]|[rty].*2|([rty])/", $string,$m );
if(!empty($m[1])) $string .="2";

echo $string ;



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
SIMarOK
Дата 2.11.2012, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 25.10.2004

Репутация: нет
Всего: нет



ksnk, работает, спасибо!

Проблема решена
PM MAIL   Вверх
kobzarkrm
Дата 2.11.2012, 23:14 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 2.11.2012
Где: Москва

Репутация: нет
Всего: нет



Цитата(Aliance @ 2.11.2012,  11:35)
Я бы вообще сделал без регулярок. Представляем строку как массив, пробегаемся для каждой буквы и записываем соотв. ей цифру. в доп. массив. Дальше делаем array_unique, implode и дописываем в конец строки. Примерный алгоритм такой, в целом конечно посложнее, нужны проверки и прочее.
При таком подходе не будет захардкодено все в if`ы.

дофига ресурсов будет жрать такая операция
PM MAIL WWW   Вверх
Fortop
Дата 3.11.2012, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(SIMarOK @  2.11.2012,  11:54 Найти цитируемый пост)
Мне кажется такой метод создаст большую нагрузку чем  вариант с регулярками

Если кажется - креститься надо.

Делаете профилирование и смотрите на результат.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1084 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.