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


Автор: PARROT 10.6.2005, 23:56
Купила книгу "Регулярные выражения", читаю, хорошо написано, почти все понятно. А вот на практике применять пока негде.
Может Вы мне будете сюда постить задания? Начиная с несложных конечно. smile
А я тут буду оставлять свои вопросы, что не поняла. smile
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Кому нужен, тестер для проверки правильности написания регулярных выражений, можно скачать тут http://www.forta.com/books/0672325667/RegExTester_JavaScript.zip
Тестер написан на языке яваскрипт. Хорошая штука.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Автор: Black 11.6.2005, 00:10
PARROT
интересно как ты вырежись из строки логин в чате???
строка имеет следующую структуру:

___[логин]: фраза такая длинная вся

я хочу чтобы на выходе получили 'логин', причем впереди может быть любое количество пробелов.
Символ _ заменяет пробел для наглядности.

Автор: Mal Hack 11.6.2005, 00:10
1. В строке только латинкисе буквы.
2. В строке только латинские буквы отдельно заглавные, отдельно прописные.
3. Пять раз буква G, еще 4 любых символа (но не перевод строки), буква H, перевод строки, фраза "PARROT - THE BEST" smile
4. Строка без пробелом.
5. В начале строки и в конце символы F, по середине не может быть L,K,J,H.
6. В начале строки и в конце символы F, по середине не может быть L,K,J,H, причем середина 6 символов.

Но это простые. Дальше сложнее будет smile

Автор: PARROT 11.6.2005, 00:37
PHP-DIRECTOR
Код

[\s+]\[[\w+]\]\:*

[\s+] -любой пробельный символ
\[             - получаем квадратную скобку
[\w+]      - набор любой алфавитно-цифровой символ, но не точка
\]            - получаем вторую квадратную скобу (просто скобка не пойдет, нужно экранировать)
\:            - двоеточие
*            - любой символ ноль или более раз

Если чего не так написала, объясните пожалуйста.

Исправилась smile

Автор: Mal Hack 11.6.2005, 00:41
Ты что читаешь-то? POSIX чтоли? smile Perl'овые учи лучше.. Они в 80% случаев быстрее работают.

Автор: PARROT 11.6.2005, 01:00
Mal Hack
Код

1) [^0-9] соответствует чему угодно, кроме цифр указанного диапазона
    [a-zA-Z]
2)[A-Z] [a-z] // не очень поняла...
3) [G]{5}\w{4}[H][\r]?\n\b"PARROT - THE BEST"\b

Проверьте пока это, пожалуйста smile
Продолжение следует завтра.
С Уважением, PARROT
Добавлено @ 01:02
Цитата(Mal @ 11.6.2005, 01:41)
Ты что читаешь-то? POSIX чтоли? smile Perl'овые учи лучше.. Они в 80% случаев быстрее работают.

В книге маленькая глава посвещена этому POSIX, я написала так, потому как незнаю, как написать иначе...пока незнаю.

Автор: Mal Hack 11.6.2005, 01:24
Цитата(PARROT @ 11.6.2005, 02:00)
В книге маленькая глава посвещена этому POSIX, я написала так, потому как незнаю, как написать иначе...пока незнаю.

Лучше сразу Perl учи...
http://detail.phpclub.ru/article/simple_regular
http://detail.phpclub.ru/article/regexp_1
http://detail.phpclub.ru/article/regexp_2
http://ru3.php.net/manual/ru/reference.pcre.pattern.modifiers.php
http://ru3.php.net/manual/ru/reference.pcre.pattern.syntax.php

Автор: PARROT 11.6.2005, 10:49
Цитата(Mal @ 11.6.2005, 02:24)
POSIX

Да в книге и есть Perl-ловые, просто это как вариант, но написано, что ими не польхуются.

Я так и не поняла, правильно я написала или нет?

Автор: Black 11.6.2005, 12:29
PARROT
Цитата
[\s+]\[[\w+]\]\:*

это скажем, так не оч. правильно. Есть такая штука как карманы, вот она и позволяет вырезать части строки. Надо взять в ()

Цитата
Да в книге и есть Perl-ловые, просто это как вариант, но написано, что ими не польхуются.

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

Автор: Mal Hack 11.6.2005, 12:33
Цитата(PHP @ 11.6.2005, 13:29)
да, они устарели

Это почему???

Автор: PARROT 11.6.2005, 12:36
Mal Hack, вот 3 вариант:
Код

[G]{5}\w{4}[H]\r\n\"PARROT\-THE\sBEST\"

Автор: Mal Hack 11.6.2005, 12:39
4 любых символа я имел ввиду и цифра и запятые и т.п.
ЗЫ: Я POSIX-то плохо знаю smile)) smile

Автор: PARROT 11.6.2005, 12:40
PHP-DIRECTOR, так правильно?
Код

\s+\[логин\]\:\фраза

Автор: Black 11.6.2005, 12:40
Mal Hack
не знаю.. везде так пишут. Я иногда книги новые листаю там везде пишут про POSIX уделяя мало места Perl'y.

Даже в книге Котерова что-то про них отрицательное сказано. Точно не помню.

Автор: PARROT 11.6.2005, 12:49
Mal Hack, так 3:
Код

[G]{5}\,\w{4}\,[H]\,\r\n\,\"PARROT\-THE\sBEST\"

Автор: Black 11.6.2005, 13:25
Цитата
\s+\[логин\]\:\фраза

все равно это немного не то, я бы так решил свою задачу:

Код

<?
$str = " fgfsg [admin]: fer fgdf fgdfgdf fwf";
if(ereg(".*\[([a-zA-Z0-9]{1,})\]:.*", $str, $matches))  {}
else { echo "Нет совпадений"; }
echo "$matches[1]";
?>


Тоже использую POSIX smile

Автор: IZ@TOP 11.6.2005, 14:29
PHP-DIRECTOR, а как на счет строки "________[IZ@TOP]: А я тут подумал и решил написать проверочку ___[ADMIN]: Ha-ha-ha...".
Добавлено @ 14:33
PHP-DIRECTOR, этот прег пожалуй должен работать без проблем:

Код

preg_match("|\[(.*?)\]\:.+|s", $str, $matches)

Добавлено @ 14:35
А на счет того что PCRE это оцтой, я скажу что это выдумки тех людей которые изучили POSIX стандарт и не могут понять PCRE. Я когда новичком был использовал POSIX и в данный момент считаю его именно "для новичков".

Автор: PARROT 11.6.2005, 14:47
PHP-DIRECTOR, дело в том что в книге до использования ereg я еще не дошла.
Думаю сначала нужно научиться понимать, то что пишешь, то есть изьясняться на REGESP.
А вот позже, займемся функциями замены и т.д.
И как говорится в книге, что единственно правильного решения не бывает, главное что бы оно было правильным!
Ну что ж продолжим?

Автор: PARROT 11.6.2005, 15:41
Mal Hack, далее:
Код

4. [\w]
    [a-zA-Z] //тут вариантов может быть много
5. ^[F][^LKJH][F]$// поидее он должен работать, так как [^LKJH] означает все кроме этого, просьба разжевать, плиз.
6. ^[F.][^LKJH][.F]$// тоже объясни плиз, точка  это любой символ.

   .   любой символ
   ^ начало строки
   $  конец строки

Автор: Black 11.6.2005, 16:34
IZ@TOP
Цитата
PHP-DIRECTOR, а как на счет строки "________[IZ@TOP]: А я тут подумал и решил написать проверочку ___[ADMIN]: Ha-ha-ha...".

не понял??? нормально все вырезается... не вырежется только если будут символы перевода строки, которых не бывает в чате. А так все что хочешь пиши будет работать smile

Сам проверь:

Код

<?
$str = "___[ADMIN]: Ha-ha-ha...";
if(ereg(".*\[([a-zA-Z0-9]{1,})\]:.*", $str, $matches))  {}
else { echo "Нет совпадений"; }
echo "$matches[1]";
?>


возвращает ADMIN

А то что Изапота не пускает так есть символ @ - а он типа запрещен smile (IZ@TOP)

Автор: Aliance 13.6.2005, 17:39
Если было - сильно не бейте. Вот чтобы мне пригодилось:
  • поиск ссылки и подстановка к ней http://
  • поиск спец. символов и их замена на Юникод (" == &quot; ... © == &copy; и т.д....)
Спасибо =)

Автор: Mal Hack 13.6.2005, 17:50
Цитата(Aliance @ 13.6.2005, 18:39)
поиск спец. символов и их замена на Юникод (" == &quot; ... © == &copy; и т.д....)

Это через str_replace лучше сделать.

Цитата(Aliance @ 13.6.2005, 18:39)
поиск ссылки и подстановка к ней http://

http://forum.vingrad.ru/index.php?showtopic=46685&view=getnewpost там глянь. Тебе нужно просто найти что-то не с http:// и заменить через preg_replace на тоже с http:// впереди.

Автор: PARROT 13.6.2005, 19:59
Mal Hack, можно объяснить более подробно?
Мы же тут учимся. Я например незнаю как найти ссылку и подставить к ней http:
Как выглядит ссылка? Как подставить? smile
Всю книгу перекопала, нашла все кроме того что нужно.
Плиз, а? smile

Автор: Mal Hack 13.6.2005, 20:08
Ну как же девушке можно отказать.. Вот тебе и задание.
Ссылка - это набор латинских символов, точек и дефисов, причем не может начинаться с - или точки и заканчиваться..
Выше я ссылки привел на примеры.
Если хочешь можешь сама поломать голову.
Личноя точно помню, что нормальный рэг на ссылки я написал раз на 20.
Добавлено @ 20:10
В догонку.. Ссылка (домен) заканчивается на . и два - четыре латинских символа.

Автор: PARROT 13.6.2005, 20:29
http[s]?:[//\w.][\w_-.][\w.][\w]{2,4} Это писала без книги, ща напишу с книгой.
А куда дефис толкать?

Вот мой нашелся так:
Код

http[s]?://[\w.]+[\w.]+[\w.]+[\w]{2,4}

http://www.traktora.spb.ru

А вот с подчеркиванием и тире:
Код

http[s]?://[\w.]+[\w_.]+[\w.]+[\w]{2,4}

http://www.traktora_avtodiesel.spb.ru

Код

http[s]?://[\w.]+[\w-.]+[\w.]+[\w]{2,4}
http://www.traktora-avtodiesel.spb.ru

Код

http[s]?://[\w.]+[\w-.]+[\w.]+[\w]{3}
https://www.traktora-avtodiesel.com

А что значит нормальный Рег? И как найти ссылку, добавив http:// ???

Автор: mr.Anderson 14.6.2005, 16:15
Эээ... Извиняюсь! Можно мне вмешаться? Я тоже решил попробовать поучить регулярки, вот, попробовал написать код запрета html-тегов (результат - все теги стираются):
Код

<form method=post>
<h4>Запрет на html-теги</h4>
<textarea name="text3"></textarea><br>
<input type="submit" name="submit3">
</form>

Код

if(isset($_POST['submit3']))
{
 if(ereg("[&<>/\]",$text3))
 {
 echo "Вы использовали html-теги! Они будут стерты.<br>";
 $newtext3=ereg_replace("[&</\([:alnum:]+)>]","",$text3);
 echo "Все исправлено. Исправленный текст:<br>$newtext3";
 }
 else echo "HTML-теги не использовались. Вы ввели:<br>$text3";
}

Прошу оценить - правильно ли все? Я его как написал, этот код, сейчас даже сам не вполне понимаю, почему он работает... smile
Кстати, еще вопросы по регуляркам:
1) Как в регулярках учесть пробелы?
2) Задача: есть файл. Нужно считать его и заменить все символы "[]" на символы "<>". Я понимаю, надо ereg_replace использовать, только как в этот ereg_replace подставить строчки файла? Не понимаю. Прошу помочь и оценить!

Автор: PARROT 14.6.2005, 16:58
sim7, а мой тестер на твою регулярку сильно ругается!
Ты искал совпадение?
Мой тестер совпадения не нашел!
Можешь объяснить мне свою регулярку?
Для чего и какие символы ты использовал в написании?

Автор: mr.Anderson 14.6.2005, 17:17
Цитата
[&</\([:alnum:]+)>]

smile Объяснить? Ну, хорошо. Значит, стираются символы амперсанда, а также все символы (включая буквы и цифры), находящиеся между <>. Между <> также могут быть слэши. Потом, на локальном сервере у меня все работает без проблем. Пробовал набирать "&quot" (без кавычек), а также любые последовательности между < и >. Все стиралось, включая и эти самые <>. Сочетание &quot также стирается полностью. Все работает на "ура", по крайней мере, у меня.

Автор: PARROT 14.6.2005, 18:40
sim7, вместо [:alnum:], лучше писать так [a-zA-Z0-9]
POSIX............... Лучше Perl-овый PRCE, будет работать везде.

Вопрос: А что ты искал?
Зачем стирать? Нужно просто запрещать пользоваться тегами, где это не положено, помоему... или я не права?
Стереть проще так $nm=strip_tags($nm);

Автор: mr.Anderson 14.6.2005, 19:42
Это я просто тренируюсь, со стиранием. Я ж говорю, только сегодня начал пробовать регулярку учить. Поэтому и стараюсь усложнять до своего максимума. Чтобы затрагивать и другие функции тоже. Можно было, конечно, написать и так:
Код

if(ereg("[&<\/[a-zA-Z0-9]>]",$text3))
{
echo "HTML запрещен!";
exit;
}

Просто мне хотелось с перезаписью.
А можете ответить на вопросы, которые я задавал в первом посте? Как делать пробелы и как выполнить описанную мной задачу?
Плюс еще вопрос. Как заставить регулярку учитывать последовательность возможных совпадений? Например, чтобы сначала шло <, потом / или \, потом цифра/буква и т.д.

Автор: Mal Hack 14.6.2005, 19:42
Цитата(PARROT @ 13.6.2005, 21:29)
А что значит нормальный Рег?

Тот который будет находить именно то, что тебе нужно.

Цитата(PARROT @ 13.6.2005, 21:29)
И как найти ссылку, добавив http:// ???

Не понял

Цитата(PARROT @ 13.6.2005, 21:29)
http[s]?://[\w.]+[\w-.]+[\w.]+[\w]{3}
https://www.traktora-avtodiesel.com

А числа, которын тоже в имени домаена могут быть где?

Цитата(sim7 @ 14.6.2005, 17:15)
попробовал написать код запрета html-тегов (результат - все теги стираются):

А не проще юзать htmlspecialchars? smile

Автор: mr.Anderson 14.6.2005, 19:44
А она что-то не работает у меня. Пишу:
Код

$nm="<br>123";
$nm=htmlspecialchars($nm);
echo $nm;

И выводится та же строчка с тегами. Почему-то.

Автор: Mal Hack 14.6.2005, 19:53
Но тэги тэгами уже не являются smile

Автор: PARROT 14.6.2005, 20:01
А не проще $mail=strip_tags($mail); ?
В этом случае он точно теги вырезает, проверено на себе!


sim7, почитай вот тут http://docs.com.ru/php_1_8.php
Добавлено @ 20:05
Mal Hack, а какие числа?
Цитата

А числа, которые тоже в имени домена, могут быть, где?

Такие [a-zA-z0-9] ?
То есть вместо [\w]+, [a-zA-z0-9]+ ДА? smile

До меня уже доходит, не как до жирафа! Сразу.

Автор: Mal Hack 14.6.2005, 20:09
Цитата(PARROT @ 14.6.2005, 21:01)
То есть вместо [\w]+, [a-zA-z0-9]+ ДА? smile

Еще я про дефисы выше говорил smile
А еще \w\d можно smile
Добавлено @ 20:12
Кстати \w нельзя использовать, т.к. туда запятая напрмер входит.

Автор: korob2001 14.6.2005, 20:17
А что вы ищите??? Я что-то не понял условия. smile
Спасибо.

Автор: PARROT 15.6.2005, 11:04
Mal Hack, я не поняла, а в какой http входят запятые? Я че то таких не видела.
Я поставила запятую, чтобы разделить, как-то отделить 2 рега.
А рег с дефисами там был!
Добавлено @ 11:08
korob2001, мы учимся писать реги. Дают задание, а мы его выполняем. Последнее задание было таким, написать рег http, смотри выше условия.

Автор: PARROT 15.6.2005, 11:14
Mal Hack
Вот один:
Код

http[s]?://[\w.]+[a-zA-Z0-9-.]+[\w.]+[\w]{2,4}
http://www.traktora-avtodiesel.spb.ru

Второй, тоже с тире, но уже от a-z и.т.д.
Код

http[s]?://[\w.]+[a-zA-Z0-9-.]+[\w.]+[\w]{3}

Так канает? smile

Автор: Mal Hack 15.6.2005, 12:49
Начинаться может как с буквы, так и с цифры, \w не канает по любому.

Автор: PARROT 15.6.2005, 14:26
Канает? см. выше.
Какие будут еще указания? Задания точнее.

Автор: Mal Hack 15.6.2005, 14:34
PARROT попробуй что-то вроде http://,ya,.ru

Автор: PARROT 15.6.2005, 14:55
Странно, но вот что у меня получилось:
Код

http://[,a-zA-Z0-9.]+

http://,ya,.ru

Автор: Mal Hack 15.6.2005, 15:04
Ты где-ть видела ссылки с запятыми???

Автор: PARROT 15.6.2005, 15:49
Так я ж думала, что мы еще рисуем... точнее учимся писать, а мы уже решили к функциям перейти?
А про под выражения не поговорим?
ОБЪЯВЛЕНИЕ:
(Для всех кто тут учиться)
Переходим ко второму уроку: Использование функций.
/////////////////////////////////////////////////////////////////////////
preg_grep() -функция которая выполняет поиск и возвращает массив совпадений;
preg_match() - выполняет поиск регулярного выражения до первого соответствия;
preg_match_all() - выполняет глобальный поиск;
preg_quote() - принимает шаблон и возвращает его защищенную версию;
preg_replace() - выполняет операцию поиска и замены;
preg_replace_callback() - выполняет операцию поиска и замены, но использует функцию обратного вызова для выполнения фактической 
замены;
preg_split() - разбивает строку на подстроки;
///////////////////////////////////////////////////////////////////////////////

Автор: mr.Anderson 15.6.2005, 16:33
Mal Hack, про htmlspecialchars() понял и проверил. smile Спасибо.
PARROT А можно небольшое отступление? Я хочу написать проверку e-mail на правильность. Сам. Вот что у меня получилось:
Код

<form method=post>
<input type=text maxlength=150 name="email"><br>
<input type=submit name="ok">
</form>

Код

if(isset($_POST['ok']))
{
    if(empty($email))
    {
        echo "Введите e-mail!";
        exit;
    }
    if(!eregi("[[:alnum:]]+@{1}[[:alnum:]]\\.[[:alnum:]]{0,3}",$email))
    {
        $email_error="<center><h3><font color=red>Некорректный e-mail!</font></h3></center>";
        echo "$email_error";
        exit;
    }
    else /* Что-то делаем */
}

Проверьте, правильно ли?

Автор: PARROT 15.6.2005, 16:42
sim7, вместо [:alnum:], мы решили писать так [a-zA-Z0-9] и не использовать POSIX.
Исправь.

Я бы так написала:
Код

if(!eregi("^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[\w]+\.[\w]{0,3}$",$email))
    {
        $email_error="<center><h3><font color=red>Некорректный e-mail!</font></h3></center>";
        echo "$email_error";
        exit;
    }

Зачем @ одно вхождение, если понятно, что собак больше чем одной быть не может.
Защищать точку двумя слэшами не нужно.


Автор: mr.Anderson 15.6.2005, 16:50
1) У меня просто на локалке при тестировании [a-z0-9_] неправильно работает, поэтому я и оставил так.
2) А разве это POSIX? Это RegEX. Я по учебнику делал (фигурные скобки, то есть, по учебнику), там это называется RegEx.
А в остальном правильно?

Автор: PARROT 15.6.2005, 17:08
А так не надо: [a-z0-9_], надо так [a-zA-Z0-9] или [\w]
Так как ты пишешь, это POSIX, отставь его в сторону и почитай тему с первого сообщения, об этом уже говорилось.
Мой тестер нашел твое мыло только вот до сюда 1538733@t и все, далее ошибка.

Автор: Mal Hack 15.6.2005, 17:11
Цитата(PARROT @ 15.6.2005, 18:08)
А так не надо: [a-z0-9_], надо так [a-zA-Z0-9] или [\w]

На самом деле надо [A-Z0-9-_] при i в модификаторах или [A-Za-z0-9-_] без модификатора i.

Автор: skalex 15.6.2005, 17:28
sim7, я вот такой regexp использую для проверки корректности e-mail:
Код
<?php
preg_match('/[0-9A-Za-z._-]+@([0-9a-z_-]+\.)+[a-z]{2,4}/', $email);
?>

Автор: Mal Hack 15.6.2005, 17:46
Mace
________@_________.com - пропустит smile
ЗЫ: тыже вроде давал тут на форуме нормальные рэги smile

Автор: skalex 15.6.2005, 18:03
Да, вот тут хоршая дискуссия была : http://forum.vingrad.ru/index.php?showtopic=46596
smile

Автор: Irokez 15.6.2005, 19:04
Цитата(PARROT @ 15.6.2005, 16:42)
вместо [:alnum:], мы решили писать так [a-zA-Z0-9] и не использовать POSIX.

и
Цитата(PARROT @ 15.6.2005, 16:42)
Я бы так написала:

Цитата(PARROT @ 15.6.2005, 16:42)
eregi...

smile

Автор: PARROT 15.6.2005, 19:54
Irokez, я функции еще не трогала. Толку хвататься за функции, если не можешь, не понимаешь как писать рег?
Я повторила условие sim7. Исправила его рег.
Предпочитаю учиться постепенно, а не хвататься сразу за все.
Так толку не будет. Тем более меня никто не гонит.

eregi - совпадение с регулярным выражением без учёта регистра символов.
И че не так? Знак вопроса перед... А зачем знак вопроса, действительно?

Лучше использовать preg_match - выполняет подстановку регулярного выражения, которая использует Perl-совместимый синтаксис регулярного выражения, работает часто быстрее, чем ereg().

Автор: Irokez 15.6.2005, 20:03
Цитата(PARROT @ 15.6.2005, 19:54)
eregi - совпадение с регулярным выражением без учёта регистра символов.

не с любым регулярным выражением, а POSIX совместимым

Автор: PARROT 15.6.2005, 20:04
Irokez, давай лучше с тобой поговорим о под выражениях?

Я с POSIX не дружу! smile

Автор: skalex 16.6.2005, 11:26
Как то раз нашел такой интересный момент в регулярных выражениях!
Например, последовательность символов [A-Za-z] можно кратко записать как [A-z].
Но как оказалось, в эту последовательность включается еще и символ подчеркивания "_" !
Показательный пример:
Код
<?php
echo (preg_match('%^[A-z]*$%', "A_b_C")) ? 'найдено' : 'ненайдено';
?>

Автор: PARROT 16.6.2005, 12:32
Так ясно же написано, что [\w], что [a-zA-Z0-9_] включают в себя любой алфавитно-цифровой символ и символ подчеркивания.

Автор: skalex 16.6.2005, 12:36
Ясно написано для \w ... Я говорил о [A-z]. В эту последовательность цифры не включены.

Автор: PARROT 16.6.2005, 13:28
[a-zA-Z0-9_] является шаблоном, в который входит символ подчеркивания.
Шаблон, это принятый образец, штамп.
Стоит ли его менять?

Другое дело набор. smile


Автор: mr.Anderson 16.6.2005, 16:21
Так. Можно мне на задания поотвечать, Mal Hack? Вы их задали, а мы их толком и не разобрали. Или я не нашел?
В общем, вот мои ответы. По порядку. С использованием указанных у PARROT функций.
Задание первое. (В строке - только латынь)
Код

$str=preg_replace("/[^[a-z]+]/i","",$str,-1);

Задания второго я не понял смысла. (В строке только латынь - отдельно заглавные, отдельно прописные буквы).
Третье (пять раз буква G, затем 4 любых символа кроме перевода строки, далее буква H, перевод строки, фраза PARROT - THE BEST):
Код

if(!preg_match("/[G{5}[^\Z]{4}H[\Z]{1}PARROT - THE BEST/"))
   {exit;}

Четвертое (Строка без пробелов):
Код

$str=preg_replace("/\s/","",$str,-1);

Пятое (в начале и конце строки символы F, в середине не могут быть символы L,K,J,H):
Код

if(!preg_match("/^(F+)[^[L|K|J|H]+](F+)$/",$str))
   {exit;}

И шестое (аналогично пятому, только середина - 6 символов):
Код

if(!preg_match("/^F{5}[^[L|K|J|H]{1}F{5}$/",$str))
   {exit;}

Прошу проверить и оценить!

P.S. PARROT, это уже PCRE, да?

Автор: PARROT 16.6.2005, 17:18
sim7, отредактируй свое сообщение, добавь то, что ты искал и что ты нашел.
Так сложно судить. Не понятно че ты ищешь.

А зачем в наборе между буквами | ?

Автор: mr.Anderson 16.6.2005, 17:22
PARROT, готово!

Автор: PARROT 16.6.2005, 17:30
Мое мнение:
1 пример: лишние скобки перед началом строки.
Sim7, у тебя нет желания сначала научиться писать регулярки, а потом уже заниматься функциями? Скачай тестер, что я давала в первом посте.
2 задание тоже...
Что такое [^\Z] во втором примере? 4 любых символа? То есть или буква или цифра? [a-zA-Z0-9_]{4}
ПРоверяй тестером. Так быстрее дело пойдет.

Автор: mr.Anderson 16.6.2005, 17:45
1. Нет, не лишние. У меня ведь такой смысл: переписать на "" все символы, кроме латинских букв. А символ ^ имеет значение "кроме" только в квадратных скобках.
2. \Z означает символ перевода строки или символ конца строки. Выражение [^\Z] означает "все символы, кроме перевода строки или конца строки".
С вашим тестером я не разобрался абсолютно.
Учиться мне пока не по чему. Когда куплю книгу, буду учиться. И потом, этот раздел называется "PHP: Уроки", а не "PHP: Практика". Так? То есть, здесь люди учатся! А не практикуются в том, что уже выучили! Так что с вашим мнением я абсолютно не согласен. Во всех отношениях и со всех сторон.
И еще: а что другие задания? Вы только два посмотрели. А указанные вами ошибки - не ошибки, как следует из моих объяснений.

Автор: Mal Hack 16.6.2005, 18:49
Цитата(sim7 @ 16.6.2005, 17:21)
Задание первое. (В строке - только латынь)

[] - лишние.

Цитата(sim7 @ 16.6.2005, 17:21)
Третье (пять раз буква G, затем 4 любых

Вообще синтасически не верен. smile

Цитата(sim7 @ 16.6.2005, 17:21)
Четвертое (Строка без пробелов):

Задания не понял smile Смысл в том, что в строке могут быть любые символы кроме пробелов,

Цитата(sim7 @ 16.6.2005, 17:21)
Пятое (в начале и конце строки символы F, в середине не могут быть символы L,K,J,H):

ini_set( 'display_errors' , '1' );
error_reporting(E_ALL);ожно упростить.

Цитата(PARROT @ 16.6.2005, 18:18)
А зачем в наборе между буквами | ?

Или. только это должно не внутри [] а внутри () указываьтся


sim7
PARROT
Ждите до выходных, сделаю вам список заданий, и сравним кто больше и правильнее сделает (аля окнкурс с голосованием).. Пока практикуйтесь smile

Автор: mr.Anderson 16.6.2005, 18:56
Задание третье - почему? smile
А у меня и стоит - стереть все пробелы. Посмотрите внимательней. smile

Автор: Mal Hack 16.6.2005, 19:09
Цитата(sim7 @ 16.6.2005, 19:56)
Задание третье - почему? smile

Посчитай кол-во [ и ]

Автор: mr.Anderson 16.6.2005, 19:11
Ой. smile Сейчас поправлю...
Будет вот так:
Код

if(!preg_match("/[G{5}[^\Z]{4}H[\Z]{1}]PARROT - THE BEST/"))
   {exit;}

Добавлено @ 19:12
Так? Или нет?
И еще: что можете посоветовать почитать про PCRE в интернете (на русском языке)?

Автор: PARROT 16.6.2005, 19:21
Mal Hack
Мне нужны знания. Так что меня можно вычеркивать.
Задания жду. Книгу читаю. Пишу.
С Уважением, PARROT.

Автор: Рыжий 16.6.2005, 19:21
хм, а можно к вам присоединиться?
Только больно ногами не бейте я еще не спец в этом smile

Автор: mr.Anderson 16.6.2005, 19:24
Давайте! Я ведь тоже начинающий. ;)

Автор: Mal Hack 16.6.2005, 19:25
PARROT не думай, что я легкие задания давать буду smile

Автор: PARROT 16.6.2005, 19:44
А мы легких путей не ищем! Не получится сегодня, получится завтра. Зато после, не будет на нашем форуме, от нас же вопросов: Поможите написать регулярку!
А регулярка Рулез!!! smile

Автор: Mal Hack 16.6.2005, 19:45
http://forum.vingrad.ru/index.php?act=ST&f=181&t=55764&unread=1
Вуаля.. Подумал я тут, что в выходные времени не будет smile))

Автор: PARROT 16.6.2005, 19:47
PHP-Script, присоединяйся.
Сделай пока задания, данные Mal Hack, см. посты выше. Для разминки.

Автор: Рыжий 16.6.2005, 21:24
Сделал пока задания Mal-hack'a - но я не смотрел все тему (ответы других я не видел, то есть у меня могут быть распространенные ошибки smile )

Цитата
1. В строке только латинкисе буквы.
2. В строке только латинские буквы отдельно заглавные, отдельно прописные.

5. В начале строки и в конце символы F, по середине не может быть L,K,J,H.
6. В начале строки и в конце символы F, по середине не может быть L,K,J,H, причем середина 6 символов.


Начнем:
1. [a-zA-Z] или можно [a-Z]
2. [a-z]|[A-Z]
5. ^[F]+[LKJH]+[F]$
6. ^[F]+[LKJH{1,6}]+[F]$

Конечно же возникнут ошибки - буду рад выслушать все предложения smile

Автор: korob2001 16.6.2005, 21:45
Цитата

korob2001, мы учимся писать реги. Дают задание, а мы его выполняем. Последнее задание было таким, написать рег http, смотри выше условия.

А можно и я поучавствую? smile Ну или задание дам???

Автор: Mal Hack 16.6.2005, 21:46
5,6 не правильные.
Добавлено @ 21:48
korob2001
Цитата(Mal @ 16.6.2005, 20:45)
http://forum.vingrad.ru/index.php?act=ST&f...=55764&unread=1

а на счет задания.. Ну пусть пока с этими разберуться, потом чсожем что-ть по сложнее придумать.. Мыслишкит уже есть smile

Автор: korob2001 16.6.2005, 22:08
Цитата

http://forum.vingrad.ru/index.php?act=ST&f...=55764&unread=1

А там нужно будет потом приводить только строку шаблона или полный код на PHP?

Автор: Mal Hack 16.6.2005, 22:32
Цитата(korob2001 @ 16.6.2005, 23:08)
А там нужно будет потом приводить только строку шаблона или полный код на PHP?

Шаблона достаточно. Когда буду через Тестер пропускать легче будет smile

Автор: korob2001 16.6.2005, 22:50
Mal Hack - несколько вопросов:

В задании номер 2, массив содержит произвольные строки где нужно отловить все цены где есть число, возможно десятичное, за которым следуют символы USD, RUR или EU, все остальные ( например: 154.49 BEF ) нужно игнорировать.
Я правильно понял условие?
Если вместо десятичной точки будет запятая, пропускать такую цену?

В задании номер 3, если встретится относительный путь его не учитывать?
Например:
/cgi-bin/test/test.pl?h=12str=def
test.php?int=107
../www/index.phtml

Автор: Mal Hack 16.6.2005, 22:59
Цитата(korob2001 @ 16.6.2005, 23:50)
все остальные ( например: 154.49 BEF ) нужно игнорировать.

Да.

Цитата(korob2001 @ 16.6.2005, 23:50)
Если вместо десятичной точки будет запятая, пропускать такую цену?

Да, пропускать. Обычно все-таки точка ставится.
Но еслии сделаешь еще и с запятой пойдет в плюс.

Цитата(korob2001 @ 16.6.2005, 23:50)
В задании номер 3, если встретится относительный путь его не учитывать?

если БЕЗ домена, то НЕ учитывать.

ЗЫ: Вопросы по той теме сразу тада пишите: http://forum.vingrad.ru/index.php?showtopic=55764

Автор: Рыжий 17.6.2005, 13:23
Mal Hack
Вот мой исправленный 5:

Код

^[F][LKJH]{1,}[F]$


Четвертое задание непонятно:
Цитата(Mal @ 10.6.2005, 23:10)
4. Строка без пробелом.

Для этого в PCRE есть код:

Код

\S


И самое затруднительное было 6:

Код

^[F][LKJH]{1,6}[F]$

Надеюсь все сработает smile

Автор: Mal Hack 19.6.2005, 09:24
1. там было написано по середине не может быть L,K,J,H, у тебя наоборот
2. [F] зачем? просто F.


Цитата(PHP @ 17.6.2005, 14:23)
{1,6}

это 1 или 6 smile

Автор: Irokez 20.6.2005, 12:14
а может попробовать сделать генератор регулярных выражений smile
мы ему даем множество строк и предполгемый результат ... а он нам рег ...

Автор: Рыжий 20.6.2005, 14:26
Irokez
Есть такая функция sql_regcase только она плохо сделана, слишком нерациональные у нее регулярки выходят smile

Автор: Irokez 20.6.2005, 16:51
Цитата(PHP @ 20.6.2005, 14:26)
Есть такая функция sql_regcase только она плохо сделана, слишком нерациональные у нее регулярки выходят

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

Автор: Bikutoru 21.6.2005, 15:54
Irokez, так это ж прям искусственный интеллект какой-то...

Автор: Irokez 21.6.2005, 15:59
Цитата(Bikutoru @ 21.6.2005, 15:54)
Irokez, так это ж прям искусственный интеллект какой-то...

ну дык, мы на мелкие задачки не размениваемся smile

Автор: Bikutoru 21.6.2005, 16:47
Но эта задача упирается в огромные вычислительные затраты (если делать что-то сложнее [aA][bB]). С деревом перебора мучиться придется (другого пути я не вижу)...
Да и очень сомневаюсь, что штука сколько-нибудь путная выйдет. Компьютер же "тупой", соображать не умеет smile...

Автор: Irokez 21.6.2005, 16:52
Цитата(Bikutoru @ 21.6.2005, 16:47)
Да и очень сомневаюсь, что штука сколько-нибудь путная выйдет. Компьютер же "тупой", соображать не умеет

ладно, я вечером дома попробую... что получится, выложу тут... (если получится..)

Автор: Bikutoru 21.6.2005, 17:11
Irokez, любопытно будет посмотреть... Я тоже подумаю, может что-нибудь и надумаю...

Автор: mclight 9.7.2005, 01:20
есть файл закодированный некоей программой....но мало по малу встречаются символы Англ алфавита. надо союрать оттуда всю инфу и распределить по массивам.например:
Author=>Bush
Description=>White House

ну понятно надеюсь.

Автор: Mal Hack 9.7.2005, 01:23
А в чем проблема-то?

Автор: alligator 24.8.2005, 00:20
я бы тоже непротив поучавствовать , только если будете давать задания сразу сложно не давайте а то я только сёдня закончил читать мануалы

Автор: CyClon 6.4.2006, 13:24
Из заданий могу предложить написать функцию для проверки E-Mail + Проверка логина (Разрешенные символы на свое усмотрение).

Автор: skalex 6.4.2006, 13:35
Цитата
Из заданий могу предложить написать функцию для проверки E-Mail ...


Неоднократно уже на форуме писались такие регулярные выражения ...

http://forum.vingrad.ru/index.php?showtopic=46596

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