Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Регулярные выражения


Автор: SIMarOK 1.11.2012, 20:30
Здравствуйте!, застрял с регуляркой

Есть группа чисел и букв:
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 

Автор: skyboy 1.11.2012, 21:09
не понятно.
приведи пример: 
что на входе → что на выходе
а то пока не понятно, почему qwy2 → qwy12, а не qwy112

Автор: SIMarOK 1.11.2012, 21:13
К примеру,

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

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

Автор: skyboy 1.11.2012, 23:58
а как ты 12 от 1 и 2 отличать будешь?

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

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

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

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

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

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

Автор: SIMarOK 2.11.2012, 11:11
Цитата(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, т.к. присустсвуют буквы из первой и второй группы.

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

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

Автор: 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 ;


?

Автор: SIMarOK 2.11.2012, 11:54
Цитата(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" т.к. присутствует только первая группа

Автор: ksnk 2.11.2012, 12:02
Код

$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 ;

Автор: SIMarOK 2.11.2012, 12:07
ksnk, работает, спасибо!

Проблема решена

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

дофига ресурсов будет жрать такая операция

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)