Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Задания на изучение регулярных выражений PCRE


Автор: Mal Hack 16.6.2005, 19:45
Задание на знание PCRE синтаксиса регулярных выражений (preg_*();).
Не постите ответ сразу, подумайте. Главное не просто написать тот или иной рэг, а сделать это оптимально.
Старался простые не давать, чтобы не легко было, т.к. учится человек когда думает.
  • 1. Пользователь ввел на форме данные в поле "Телефон". Надо проверить, подходит ли строка введенная пользователем под шаблон: (ХХХХ) ХХХ-ХХХХ, причем важный момент в том, что 78-9789 - является правильным адресом (т.е. маска не жесткая по кол-во цифр, но кол-во цифр не должно быть 1, к примеру). После ) может быть пробел, а может и нет, а может и несколько (это подсказка).
  • 2. Есть текст с списками цен. Надо вырезать (получить массива $matches) из него цены в USD, RUR или EU. ( как пример могут быть строка 23.78 USD ).
  • 3. Необходимо в тексте выделить доменные имена, сделав их ссылкам, в зонах com, net, org красным цветом, а ru, su, ua - синим, aero - зеленым smile. Т.е. в тексте есть "зайди сюда ya.ru". Подсказка - выполнить надо через callback функцию. ЗЫ: ссылка может иметь вид: ya.ru?param1=param2&... или ya.ru/wer/wr/wr.
  • 4. Ну и банальное. Проверка e-mail'a. Подсказка: домен и мыло могут заканчиваться только на букву или число. В середине имени мыла может быть "." , "_" , "-", в домене только "-".
Думаю для первого раза достаточно.
Что не понятно по вопросам - спрашиваете.
Проверка результатов будет во вторник - среду.
Ответы сразу не пишите, чтобы другие не видели...
Как вариант можете присылать ответы на мыло mal.hack@gmail.com или на ПМ, во вторник - среду выложу.

Автор: Mal Hack 22.6.2005, 09:16
Итоги завтра подведу... Сегодня не успеваю.

Автор: Opik 22.6.2005, 09:38
Mal Hack
эт хорошо smile я тож сёня попытаюсь сделать smile)

Автор: Рыжий 22.6.2005, 10:37
ой, блин я вообще забыл про них, после обеда решу последние 2 smile

Автор: Mal Hack 22.6.2005, 19:41
думаю никто не обидится, если я до субботы протяну? Диплом все-таки smile))
В субботу стопудова будет.
Да и время вам еще дается.

Автор: Рыжий 22.6.2005, 21:06
Mal Hack
Не обидимся конечно, тем более я задания так и не сделал, блин лето а дел по горло smile smile

Автор: Mal Hack 26.6.2005, 15:23
Резалты будут где-то через час...

Opik и где твои попытки? smile

Автор: Mal Hack 26.6.2005, 16:08
Мой вариант:
Код
<?php

$phone = "(1123) 123-1233";
print "Phone: " . ( ( preg_match( "#^\(\d{2,4}\)\s*\d{1,3}\-\d{2,4}$#" , $phone ) ) ? "Good" : "Bad" );

print "<br><br><br>";

$data = "jkhka 12.8 EU dsfns,. fjsfkl sfsnfsf 54 USD e656 56 56 23,6 RUR";
preg_match_all( "#\d+(?:(?:,|\.)\d)?+\s+(?:RUR|USD|EU)#s" , $data , $matches , PREG_PATTERN_ORDER );
print_r( $matches );

print "<br><br><br>";

$str = "ya.ru is the very good site, but not better that kgb.ru. test.su is opened. templ.com closed aeroflot.aero";
print preg_replace( "#([a-z0-9]{1,}(?:(?:[a-z0-9]{1,}[a-z0-9\-\.]{0,1}[a-z0-9]{1,})|[a-z0-9]{1,})*\.([a-z]{2,4}))#ei" , "test( '\\1' , '\\2' )" , $str );
                                                                                                              
function test( $f , $d )
 {
  $d = strtolower( $d );

  if( $d == "com" || $d == "net" || $d == "org" )
   {  return "<a href='http://" . $f . "'><span style='color:red;'>" .$f . "</span></a>";  }

  if( $d == "ru" || $d == "su" || $d == "ua" )
   {  return "<a href='http://" . $f . "'><span style='color:blue;'>" .$f . "</span></a>";  }

  if( $d == "aero" )
   {  return "<a href='http://" . $f . "'><span style='color:green;'>" .$f . "</span></a>";  }

  return $f;
 }

print "<br><br><br>";

$email = "adsc...fsdfsd____f@ya.ma-test-il.ru";
print "Email: " . ( ( preg_match( "#^([a-z0-9]){1}[a-z0-9\-_.+]*([a-z0-9]){1}@[a-z0-9]{1,}(([a-z0-9]{1,}[a-z0-9\-\.]{0,1}[a-z0-9]{1,})|[a-z0-9]{1,})*\.[a-z]{2,4}$#i" , $email ) ) ? "Good" : "Bad" );

?>

Добавлено @ 16:16
Вариант PARROT
ЗЫ: Сразу ставил параметры чтобы показать что не правильно.
Код
<?php

#PARROT

$phone = "(112387593875894758937858937589733) 12456464563-124645-6464-6464-645-64633";
print "Phone: " . ( ( preg_match( "#^[\(\d\)]+[\s]*[\d-]+[\d]{2,4}$#" , $phone ) ) ? "Good" : "Bad" );

print "<br><br><br>";

$data = "jkhka 12.8 EU dsfns,. fjsfkl sfsnfsf 54 USD e656 56 56 .23. RUR";
preg_match_all( "#[\d.]+[\s]*(USD|RUR|EU)+#s" , $data , $matches , PREG_PATTERN_ORDER );
print_r( $matches );

print "<br><br><br>";

$str = "ya.ru is the very good site, but not better that kgb.ru. test.su is opened. templ.com closed aeroflot.aero";
print preg_replace( "#([\w-]*\.){1,2}[\w]{2,4}[?]?[[\w=&//]*]?#ei" , "test( '\\1' , '\\2' )" , $str );
                                                                                                             
function test( $f , $d )
 {
  $d = strtolower( $d );

  if( $d == "com" || $d == "net" || $d == "org" )
   {  return "<a href='http://" . $f . "'><span style='color:red;'>" .$f . "</span></a>";  }

  if( $d == "ru" || $d == "su" || $d == "ua" )
   {  return "<a href='http://" . $f . "'><span style='color:blue;'>" .$f . "</span></a>";  }

  if( $d == "aero" )
   {  return "<a href='http://" . $f . "'><span style='color:green;'>" .$f . "</span></a>";  }

  return $f;
 }

print "<br><br><br>";

$email = "adsc...fsdfsd____f@ys_sa.ma-test-il.ru";
print "Email: " . ( ( preg_match( "#^(\w*(.|_|-))*@([\w-]*\.){1,2}[\w]{2,4}$#i" , $email ) ) ? "Good" : "Bad" );


?>

Автор: Mal Hack 26.6.2005, 16:20
Вариант PHP_Script.
ЗЫ: С деньгами все работает.
Код
<?php

#PHP-Script

$phone = "sdasdsadssd(112387593875894758937858937589733) 12456464563-124645-6464-6464-645-64633adasdasd";
print "Phone: " . ( ( preg_match( "#(\(\d{4,4}\) ?)?\d{2}\-?\d{2,2}\-?\d{2,2}#" , $phone ) ) ? "Good" : "Bad" );

print "<br><br><br>";

$data = "jkhka 12.8 EU dsfns,. fjsfkl sfsnfsf 54 USD e656 56 56 23.0 RUR";
preg_match_all( "#\d{0,10}\.?\d{1,2}? ?(USD|EU|RUR)#is" , $data , $matches , PREG_PATTERN_ORDER );
print_r( $matches );

?>

Автор: Рыжий 26.6.2005, 19:59
Цитата(Mal @ 26.6.2005, 15:20)
С деньгами все работает.


Что честно? Урря! smile

Автор: PARROT 26.6.2005, 21:21
Результаты есть. А вывод? Что у меня например не так? smile

Автор: Mal Hack 26.6.2005, 21:29
PARROT основная ошибка что ты не использовала ограничители, это раз, а два, то что в 3 и 4 задании рещила обойтись общим случаем. Ты должна регуляркой проверять по максимуму.

Автор: PARROT 26.6.2005, 21:41
Совсем ни одного правильного ответа? smile
Скажем, 3 задание, не совсем для начинающих...
Давайте разберем функции, которыми пользовались. Только пожалуйста подробно! Спасибо!
Читать - читала. Но мне почему-то чтение книг и мануалов ничего не дает! Только подробное объяснение, пример и практика.

Автор: Mal Hack 26.6.2005, 21:50
PARROT в принципе, если на вход идет нормальная строка, то у тебя работает, а если идет подставная (заведомо ошибочная) то у тебя тоже рэг срабатывает, чего быть не должно.

Автор: Sardar 26.6.2005, 22:34
Mal Hack на доменах 4того уровня твой рег в примере 3 не сработает. Так думаю лучше:
Код
$zones=array(
 array("com", "net", "org"), "<a href='http://[::subj::]' style='color:red; text-decoration: underline;'>[::subj::]</a>",
 array("ru", "su", "ua"), "<a href='http://[::subj::]' style='color:blue; text-decoration: underline;'>[::subj::]</a>",
 array("aero"), "<a href='http://[::subj::]' style='color:green; text-decoration: underline;'>[::subj::]</a>",
);

function test($m) {
  global $zones;
  $h=strtolower($m[2]);
  for($i=0; $i<sizeof($zones); $i+=2) {
    if(in_array($h, $zones[$i])) return str_replace("[::subj::]", $m[1], $zones[$i+1]);
  }
  return "<b>".$m[1]."</b>"; //нет данных
}

$str = "ya.ru is the very good site, but not better that. .ttt.wwer.wow.kgb.ru. test.su is opened. templ.com closed aeroflot.aero";
echo preg_replace_callback("/(?<=^|\s)([a-zA-Z0-9_]+(?:\.[a-zA-Z0-9_]+)*(?:\.([a-zA-Z0-9_]+)))/","test",$str);


Домен: .ttt.wwer.wow.kgb.ru (точка в начале) специально не ищеться, если это не верно, то уберать конструкцию: (?<=^|\s)

Автор: PARROT 26.6.2005, 22:54
Идеальных вариантов написания регов нет?
Получается, кто во что горазд...
А главное понять, че пишешь?И зачем... А?

Автор: Mal Hack 27.6.2005, 08:05
Цитата(Sardar @ 26.6.2005, 23:34)
Домен: .ttt.wwer.wow.kgb.ru (точка в начале) специально не ищеться, если это не верно, то уберать конструкцию: (?<=^|\s)

Ну смотри. В теории домен - слово в предложении. А слово отделяется пробелом или находится в начале строки. Поэтому, ИМХО, вполне логично, данный домен не учитывать.

Цитата(PARROT @ 26.6.2005, 23:54)
Идеальных вариантов написания регов нет?

Да.

Цитата(PARROT @ 26.6.2005, 23:54)
Получается, кто во что горазд...

Нет. Нет идеального рэга для твоего конкретного случая, но есть какие-то общие моменты, которые надо соблюдать.
К примеру можно искать с http:// домены, а можно и нет, тем не менее рег на сам домен остается неизменным.

Автор: Sardar 28.6.2005, 23:36
Цитата(Mal @ 27.6.2005, 07:05)
Ну смотри. В теории домен - слово в предложении. А слово отделяется пробелом или находится в начале строки. Поэтому, ИМХО, вполне логично, данный домен не учитывать.

Я имел в виду что в моём коде такой домен не воспринимаеться и как убрать такое поведение если вдруг понадобиться smile

Автор: Opik 29.6.2005, 01:39
Цитата
Opik и где твои попытки

времени так и не нашел smile

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