Перейти к содержимому

Реферальная программа Мегаплана

Партнерская программа Kredov

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

#1 tro9an

tro9an
  • Пользователь
  • 34 сообщений
  • Репутация: 0
0

Отправлено 11 Октябрь 2010 - 18:29

Тока начал изучать регулярные выражения, проверте пожалуйста что я тут написал и вообще правильно ли:
Логин:
/^[a-zZ-A0-9]{3,}+$/
можно вводить все буквы и цыфры, и длинна логина должна быть не меньше чем 3 символа(?)

^[a-zZ-A0-9]+@[-a-z0-9]+(.[-a-z0-9])*.[a-z]+$/
это проверка email

Будит ли это работать? и как сделать чтобы можно было вводить тере и знак подчёркивания, а всё остальное нельзя например: ad_min@xxxxx.xx, ad-min@xxxxx.xx

 

 

  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85
Советую обратить внимание на следующее:
  1. Регулярное выражение. Вытаскивание адреса
  2. Регулярные выражения
  3. Не понятно регулярное выражение
  4. Регулярные выражения
  5. Как сделать регулярное выражение для редиректа

#2 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 11 Октябрь 2010 - 21:23

tro9an,
/^[a-zZ-A0-9]{3,}+$/

[a-zZ-A0-9] - лучше использовать флаги, чем писать a-zA-Z. Флаг регистронезависимости - i. Так же у вас не правильная запись последовательности символов. Z-A не будет работать вроде, обязательно надо A-Z

{3,}+ Масло масленое.
{3,} - 3 и более
+ - один и более

Правильная регулярка:
/^[a-z0-9]{3,}$/i
Кстати, у вас в логине нельзя использовать _ и др. символы

По поводу второй регулярки:
/^[a-zZ-A0-9]+@[-a-z0-9]+(.[-a-z0-9])*.[a-z]+$/
Явно работать не будет. Почитайте про спецсимволы и их экранировку.
Я бы записал так:
/^[-_a-z0-9\.]+@[-a-z0-9]+(\.[-a-z0-9])*\.[a-z]+$/i
Замечание! Как только появится(если ещё не появилась) почта с рускоязычными доменами, данный пример работать не будет.
Реальные регулярки нужно составлять по RFC к email. Да и всё равно валидацию email можно провести только частично, всё равно возможно левое заполнение.
  • 0

#3 tro9an

tro9an
    Topic Starter
  • Пользователь
  • 34 сообщений
  • Репутация: 0

Отправлено 12 Октябрь 2010 - 14:58

ZiTosS, в конце каждой регулярки вы ставили /i, что это значит?
  • 0

#4 gaaarfild

gaaarfild
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 12 Октябрь 2010 - 15:22

Это значит, что поиск регистронезависимый.
  • 0

#5 tro9an

tro9an
    Topic Starter
  • Пользователь
  • 34 сообщений
  • Репутация: 0

Отправлено 18 Октябрь 2010 - 15:20

1. проверка даты типа дд-мм-гггг
/^\d{2,2}([.-/])+\d{2,2}([.-/])+\d{4,4}$/i
не работает, чё я тут неправильно написал?
2.Как сделать точную проверку даты и месяца веди день-39 или например 77, вполне пропустит(тоже самое с месяцом)
З.Ы и если добавите новые символы то поясните их пожалуйста
  • 0

#6 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 19 Октябрь 2010 - 20:52

tro9an, сейчас разберемся, вот рабочий пример. Попробуйте сначала сами найти отличия.
<?php

$date = "01-01-2010"; // так же прокатят 01.01.2010 01/01/2010 01012010
preg_match('/^(\d{2})[.\-\/]?(\d{2})[.\-\/]?(\d{4})$/i', $date, $match);
print_r($match);

?>

1) Скобки нужны для выделения карманов, которые помещаются в $match. Зачем вам в карманы разделители? Поэтому скобками окружил в шаблоне день, месяц и год. С разделителей скобки убрал.
2) Заменил {n,n} на {n} это тоже самое
3) Не забываем экранировать спецсимволы:
3.1) Хоть "/" и не является спецсимволом, но в данном примере мы используем, как символ начала и конца шаблона -> спецсимвол, его нужно экранировать, если он используется в шаблоне, что я и сделал "\/"
3.2) Символ "-" является спецсимволом, когда его используют в маске выбора [...] не первым символом, поэтому его тоже экранировали "\-"
3.3) Символ "." в шаблонах так же является спецсимволом, но как я понял, его не обязательно экранировать в маске выбора, компилятор сам понимает, что в данном случае точка выступает как обычный символ шаблона.
4) У вас в шаблоне использовался "+"(1 или много повторений), я заменил его на "?"(0 или 1 повторений), думаю объяснять не нужно, что раньше бы пролезала бы и дата 01--01---2010, 01./-01-/.2010 и подобные другие.

Проверку теперь можете сделать по $match:
$day = intval($match[1]); // день
$month = intval($match[2]); // месяц
$year = intval($match[3]); // год


Кстати, у вас не пройдут даты 01.01.10, 1.1.2010, 1.1.10 и подобные :lol:
  • 0

#7 Banderas

Banderas
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1

Отправлено 08 Январь 2011 - 00:07

Мне нужно разбить строку

23:44:53 3rd || Слоболян Богдан Владимирович || Banderas123@yandex.ru || Кое что, например о Панкратионе. Это тема!!!

по частям, которые отделены ||

Я использую функцию split()
$farr = file("$D_ROOT/../www/orders/feedback.txt");
echo '<pre>';
print_r($farr[0]);
echo '</pre>';

$end[] = split("\|{2}", $farr[0]); # или "\|\|"

foreach ($end as $key => $value) echo $value.'<br>';

У меня выскакивает ошибка.

Deprecated: Function split() is deprecated in Z:\home\test1.ru\www\view_fb.php on line 19


Также пробовал функцию preg_match()
preg_match("/^[а-яa-z0-9:]+/i", $farr[0], $end);

В чем ошибка? Я нифига не понял в регулярных выражениях, да? ((
  • 0


#8 Banderas

Banderas
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1

Отправлено 08 Январь 2011 - 03:06

Хах!!! УРА!!! я сделал это!!! вуху!!! :)
for ($i=0;$i<count($farr);$i++) {
$end = preg_split("/[||]/", $farr[$i]);
foreach ($end as $key => $value) echo nl2br($value);
}

как же приятно ;)
  • 0


#9 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 08 Январь 2011 - 10:38

Banderas, а не проще explode использовать, не всю же жизнь трусы через голову одевать ;) ?


  • 0

#10 Banderas

Banderas
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1

Отправлено 08 Январь 2011 - 11:15

surfer, можно конечно, но очень хотелось попробовать регулярные выражения ;)
Кстати, возник вопрос!
<table border='0' cellpadding='10'>
<tr align=center bgcolor='#e7e7e7'>
<td>Дата</td>
<td>Инициалы</td>
<td>e-mail</td>
<td>Сообщение</td>
</tr>
<?php
for ($i=0;$i<count($farr);$i++) {
$end = preg_split("/[||]/", $farr[$i]);
echo '<tr>';
for ($j=0;$j<count($end);$j++) {
echo '<td>'.$end[$j].'</td>';
$j += 1;
}
echo '</tr>';

}

При выполнение данного кода, парсер заполняет массив $end вот так

Array ( [0] => 22:03:55 7th [1] => [2] => Вольский Владислав Сергеевич [3] => [4] => cockt@mail.ru [5] => [6] => Кое какой текст для проверки функции mail() )


это конечно не проблема, но хотелось бы удалить пустые ненужные элементы и перезаписать ключи по порядку. Можете подсказать алгоритм?

пс. вот с explode()
foreach ($farr as $key => $value) {
$good = explode('||', $value);
echo '<tr>';
foreach ($good as $k => $v) echo '<td>'.$v.'</td>';
echo '</tr>';
}

  • 0


robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru