[regexp, php] Полезные регулярные выражения на PHP

Форум для программистов

Сообщение Миша Спларов » Сб авг 16, 2003 7:21 pm

В этом топике я буду иногда выкладывать полезные регулярные выражения, которые могут пригодится при разработке сайта. Все они написаны мной.
Буду вам очень благодарен, если вы будете сообщать здесь о багах, которые в них встретите (если встретите <!--emo&:)-->Изображение<!--endemo-->) и том для каких целей вы их используете, если эта цель не явная, не относящаяся к прямому, обозначенному мною, применении.
Я буду использовать семантику PHP, т.к. писались они изначально, как раз, для этого языка, но я допускаю, что они будут работать и в других языках (например в Perl).

!!!Функция обновлена!!!
Первое регулярное выражение служит для проверки валидности e-mail адреса (точнее - это функция для проверки e-mail адреса при помощи регулярного выражения):
Код: выделить все
// версия: 1.2
function mCheckMail ($mail) {
   global $mail;
   $mail= trim ($mail);
   if (!$mail) return 0;
   if (!preg_match('/^(?:[a-z0-9][a-z0-9_.-]*[a-z0-9])@(?:[a-z0-9][a-z0-9.-]*[a-z0-9])(?:\.(?>[a-z]{2}|com|net|org|info|name|edu|int|gov|mil|biz|museum|coop|aero))$/i',$mail)) return 0;
   $mail= str_replace ('@', '%40', $mail);
   $mail='mailto:'.$mail;
   return 1;
};

Использовать эту функцию можно например так:
Код: выделить все
<?php

// ...сама функция, я не стал снова её переписывать

$mail='mail@mail.com';
if (CheckMail ($mail)) $mail='<a href="'.$mail.'">электропочта</a>';
?>
Последний раз редактировалось Миша Спларов Пн авг 18, 2003 7:18 pm, всего редактировалось 1 раз.
«Проектирование интерфейсов — увлекательный дизайнерский процесс. Схожее удовольствие можно получить от сложной верстки, от создания многомерных схем и решения других задач на логику и эстетику». (q) A. Лебедев
Миша Спларов
Генерал-лейтенант
 
Сообщений: 3022
Зарегистрирован: Пн апр 22, 2002 7:58 am
Откуда: Россия, Томск
Пункты репутации: 0

Сообщение Миша Спларов » Пн авг 18, 2003 7:21 pm

Ещё одна. Проверка url. Использовать аналогично первой (первая, кстати, обновлена).
Код: выделить все
function mCheckURL ($url) {
   global $url;
   if (!$url) return 0;
   if (!preg_match('/^(?:(?:https?|ftp):\/\/)/',$url)) $url='http://'.$url;
   if (!preg_match('/^(?:(?:https?|ftp):\/\/)(?:[a-z0-9][a-z0-9.-]*[a-z0-9])(?:\.(?>[a-z]{2}|com|net|org|info|name|edu|int|gov|mil|biz|museum|coop|aero))(?:\/(?:|[a-z0-9.,_%#&?+=~\/-]+)|)$/i', $url)) return 0;
   return 1;
};
Последний раз редактировалось Миша Спларов Пн авг 18, 2003 7:24 pm, всего редактировалось 1 раз.
«Проектирование интерфейсов — увлекательный дизайнерский процесс. Схожее удовольствие можно получить от сложной верстки, от создания многомерных схем и решения других задач на логику и эстетику». (q) A. Лебедев
Миша Спларов
Генерал-лейтенант
 
Сообщений: 3022
Зарегистрирован: Пн апр 22, 2002 7:58 am
Откуда: Россия, Томск
Пункты репутации: 0

Сообщение Миша Спларов » Чт янв 15, 2004 6:26 pm

Код: выделить все
// расстановка переносов (взято с xpoint.ru)
$RusA = "[абвгдеёжзийклмнопрстуфхцчшщъыьэюя]";
$RusV = "[аеёиоуыэюя]";
$RusN = "[бвгджзклмнпрстфхцчшщ]";
$RusX = "[йъь]";
$text= preg_replace ("/($RusX)($RusA$RusA)/","\\1­\\2",$text);
$text= preg_replace ("/($RusV)($RusV$RusA)/","\\1­\\2",$text);
$text= preg_replace ("/($RusV$RusN)($RusN$RusV)/","\\1­\\2",$text);
$text= preg_replace ("/($RusN$RusV)($RusN$RusV)/","\\1­\\2",$text);
$text= preg_replace ("/($RusV$RusN)($RusN$RusN$RusV)/","\\1­\\2",$text);
$text= preg_replace ("/($RusV$RusN$RusN)($RusN$RusN$RusV)/","\\1­\\2",$text);

$text - это текст, в котором надо расставить переносы
«Проектирование интерфейсов — увлекательный дизайнерский процесс. Схожее удовольствие можно получить от сложной верстки, от создания многомерных схем и решения других задач на логику и эстетику». (q) A. Лебедев
Миша Спларов
Генерал-лейтенант
 
Сообщений: 3022
Зарегистрирован: Пн апр 22, 2002 7:58 am
Откуда: Россия, Томск
Пункты репутации: 0

Сообщение pal » Пн янв 19, 2004 12:25 am

2Миша Спларов
насчет второго поста - зачем там global $url?
pal
Ст. сержант
 
Сообщений: 37
Зарегистрирован: Пн сен 16, 2002 11:32 pm
Откуда: Minsk
Пункты репутации: 0

Сообщение Миша Спларов » Пн янв 19, 2004 5:25 am

2pal
А потому, что это функция, и, если проверенный, и может быть изменённый урл тебе надо будет использовать для вставки куда-то (функция возвращает только истинность и ложность).
«Проектирование интерфейсов — увлекательный дизайнерский процесс. Схожее удовольствие можно получить от сложной верстки, от создания многомерных схем и решения других задач на логику и эстетику». (q) A. Лебедев
Миша Спларов
Генерал-лейтенант
 
Сообщений: 3022
Зарегистрирован: Пн апр 22, 2002 7:58 am
Откуда: Россия, Томск
Пункты репутации: 0

Сообщение SiMM » Пн янв 19, 2004 9:03 am

2Миша Спларов, как вариант можно было сделать иначе: функция возвращает скорректированные данные или false - тогда кому надо в условии могли бы написать просто if($cvar=func($var))...
Впрочем, никто не мешает подправить скрипты под себя - как известно, на вкус и цвет... :)
IRC: <a href='http://www.fileforum.ru/irc.php' target='_blank'>RUSNET #fileforum</a> (irc.tsk.ru:6669)
SiMM
Подполковник
 
Сообщений: 588
Зарегистрирован: Чт июн 13, 2002 8:41 am
Пункты репутации: 0

Сообщение Миша Спларов » Пн янв 19, 2004 10:55 am

2SiMM
<!--QuoteBegin--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Цитата </td></tr><tr><td id='QUOTE'><!--QuoteEBegin-->никто не мешает подправить скрипты под себя <!--QuoteEnd--></td></tr></table><div class='postcolor'><!--QuoteEEnd-->
Вот именно. Сейчас я использую изменённую функцию...
«Проектирование интерфейсов — увлекательный дизайнерский процесс. Схожее удовольствие можно получить от сложной верстки, от создания многомерных схем и решения других задач на логику и эстетику». (q) A. Лебедев
Миша Спларов
Генерал-лейтенант
 
Сообщений: 3022
Зарегистрирован: Пн апр 22, 2002 7:58 am
Откуда: Россия, Томск
Пункты репутации: 0

Сообщение ita » Чт фев 12, 2004 8:56 am

2Миша Спларов
Код: выделить все
function CheckName($name){
  if (!preg_match("/^[A-Za-z\s]{4,10}/", $name)){
   return 0;
  }
  return $name;
}

и понять не могу чего не так - если $name < 4 - возвращает 0, > 10 - возвращает $name .. чего с этим регулярным не так?
Продается лунный грунт! Предоплата 100%, самовывоз.
ita
Подполковник
 
Сообщений: 717
Зарегистрирован: Ср сен 11, 2002 12:00 am
Откуда: dp.ua
Пункты репутации: 0

Сообщение Миша Спларов » Чт фев 12, 2004 12:55 pm

2ita
Хммм...
Код: выделить все
function CheckName($name){
 if (!preg_match("/^[a-z\s]{4,10}$/i", $name)){
  return 0;
 }
 return $name;
}
$name='Splurov';
echo CheckName($name);

Использовал такой код. Всё работает прекрасно...
У тебя проблема была в отсутствии указания на то, что строка закончилась '$'. PHP находил первые десять символов от начала строки и ему пофиг есть что потом или нет ему главное, в твоём рег. выраж., было найти первые от 4 до 10 символов
;-)
«Проектирование интерфейсов — увлекательный дизайнерский процесс. Схожее удовольствие можно получить от сложной верстки, от создания многомерных схем и решения других задач на логику и эстетику». (q) A. Лебедев
Миша Спларов
Генерал-лейтенант
 
Сообщений: 3022
Зарегистрирован: Пн апр 22, 2002 7:58 am
Откуда: Россия, Томск
Пункты репутации: 0

Сообщение ita » Чт фев 12, 2004 1:21 pm

$ - строка закончилась
а i - не обращать внимания на регистр? наверное так..

хех, теперь такую кучу регулярных переделать надо.. ну да ладно, пасиб :)
Продается лунный грунт! Предоплата 100%, самовывоз.
ita
Подполковник
 
Сообщений: 717
Зарегистрирован: Ср сен 11, 2002 12:00 am
Откуда: dp.ua
Пункты репутации: 0

Сообщение Миша Спларов » Пт фев 13, 2004 9:58 am

2ita
Не за что.
<!--QuoteBegin--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Цитата </td></tr><tr><td id='QUOTE'><!--QuoteEBegin-->$ - строка закончилась а i - не обращать внимания на регистр<!--QuoteEnd--></td></tr></table><div class='postcolor'><!--QuoteEEnd-->
именно.
«Проектирование интерфейсов — увлекательный дизайнерский процесс. Схожее удовольствие можно получить от сложной верстки, от создания многомерных схем и решения других задач на логику и эстетику». (q) A. Лебедев
Миша Спларов
Генерал-лейтенант
 
Сообщений: 3022
Зарегистрирован: Пн апр 22, 2002 7:58 am
Откуда: Россия, Томск
Пункты репутации: 0

Сообщение sm@rt » Чт сен 23, 2004 5:20 pm

Вот сегодня налабать пришлось.
Функция проверяет правильность даты по формату DD.MM.YYYY
(катят года с 1900 по 2099 - это ограничения триальной версии, купить Про вы её можете по адресу Одесса, Малая Арнаутская, 1 <!--emo&:)-->[img]style_emoticons/<#EMO_DIR#>/smile.gif[/img]<!--endemo--> )
Единственное что проскакивает так это что 29 февраля покатит в любом году, можно сделать наоборот (т.е. никакого 29 февраля). Даже не знаю что луше. Приведу оба: 1 символ отличия.

29 февраля везде:
Код: выделить все
^((([0-2][0-9]|31)\.(01|03|05|07|08|10|12))|(([0-2][0-9]|30)\.(04|06|09|11))|(([0-1][0-9]|2[1-9])\.(02)))\.(19|20)\d{2}$

без 29 февраля:
Код: выделить все
^((([0-2][0-9]|31)\.(01|03|05|07|08|10|12))|(([0-2][0-9]|30)\.(04|06|09|11))|(([0-1][0-9]|2[1-8])\.(02)))\.(19|20)\d{2}$
Последний раз редактировалось sm@rt Пт сен 24, 2004 10:19 am, всего редактировалось 1 раз.
Красота и массовые расстрелы спасут мир.
sm@rt
Генерал-майор
 
Сообщений: 2935
Зарегистрирован: Вт фев 25, 2003 4:42 pm
Пункты репутации: 0

Сообщение SiMM » Чт сен 23, 2004 7:40 pm

sm@rt, использовать <a href='http://php.net/explode' target='_blank'>explode</a> + <a href='http://php.net/checkdate' target='_blank'>checkdate</a> не разумнее ли?
Кстати, по твоим регуляркам asd12.12.1999afasdf - очень даже дата получается <!--emo&;)-->[img]style_emoticons/<#EMO_DIR#>/wink.gif[/img]<!--endemo-->
Последний раз редактировалось SiMM Чт сен 23, 2004 7:42 pm, всего редактировалось 1 раз.
IRC: <a href='http://www.fileforum.ru/irc.php' target='_blank'>RUSNET #fileforum</a> (irc.tsk.ru:6669)
SiMM
Подполковник
 
Сообщений: 588
Зарегистрирован: Чт июн 13, 2002 8:41 am
Пункты репутации: 0

Сообщение sm@rt » Пт сен 24, 2004 10:21 am

2SiMM
<!--QuoteBegin-SiMM+Sep 23 2004, 22:40--><div class='quotetop'>QUOTE(SiMM @ Sep 23 2004, 22:40)</div><div class='quotemain'><!--QuoteEBegin-->sm@rt, использовать explode + checkdate не разумнее ли?
<!--QuoteEnd--></div><!--QuoteEEnd-->Долго рассказывать, но мне нужно было именно заюзать регулярку.
<!--QuoteBegin-SiMM+Sep 23 2004, 22:40--><div class='quotetop'>QUOTE(SiMM @ Sep 23 2004, 22:40)</div><div class='quotemain'><!--QuoteEBegin-->Кстати, по твоим регуляркам asd12.12.1999afasdf - очень даже дата получается
<!--QuoteEnd--></div><!--QuoteEEnd--> Sorry. В начале надо добавить символ начала строки - в конце - конца строки. Переделал
Красота и массовые расстрелы спасут мир.
sm@rt
Генерал-майор
 
Сообщений: 2935
Зарегистрирован: Вт фев 25, 2003 4:42 pm
Пункты репутации: 0


Вернуться в Программирование

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

cron