Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

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

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Объясните зачем нужен спецсимвол "|"
 
 автор: Гавриленко Дмитрий   (21.07.2010 в 15:12)   письмо автору
 
 

Его значение: "Любое из разделяемых выражений, например, выражение first|second соответствует любой строке, содержащей либо слово first, либо слово second."
Так вот, зачем же в регулярных выражениях всегда в начале и в конце ставить "|"?
Объясните пожалуйста!
И вот пример- "|[a-z_][^0-9]|i"
Возможны буквы от a до z не смотря на регистр и доступен символ подчеркивания _. Не доступны
цифры!
Но, так как после [a-z_] нет "+" плюса можно вводить только один символ, но это почему-то не работает. Сколько хочешь столько и пиши. При том что стоит запрет "^" на числа, их все равно можно употреблять с буквами...
Вот посмотрите, именно это рв "|[a-z_][^0-9]|i" не работает вообще не как.
Пробывал без запрета на цифры "|[a-z_]|i". Тут вроде нет от 0-9 а их все равно употреблять можно.
Надо чтобы соответствовало - Разрешены английские буквы и символ подчеркивания!

  Ответить  
 
 автор: tvv123456   (21.07.2010 в 15:28)   письмо автору
 
   для: Гавриленко Дмитрий   (21.07.2010 в 15:12)
 

А в какой оболочке вы использовали этот паттерн?(можете показать кусок кода окружающего это выражение?

  Ответить  
 
 автор: Гавриленко Дмитрий   (21.07.2010 в 15:31)   письмо автору
 
   для: tvv123456   (21.07.2010 в 15:28)
 

<?php 
echo '
<form method=get>
Разрешены английские буквы и символ подчеркивания!<br>
<input type=text size=15 name=name value='
.$_GET['name'].'>
<br><input type=submit><br>'
;
if(
preg_match("|[a-z_][^0-9]|i",$_GET['name'])) echo 'Ник введен верно! ',$_GET['name'];
else echo 
'Ник введен не корректно!';
?>

  Ответить  
 
 автор: tvv123456   (21.07.2010 в 16:01)   письмо автору
 
   для: Гавриленко Дмитрий   (21.07.2010 в 15:31)
 

<?php  
echo 
<form method=get> 
Разрешены английские буквы и символ подчеркивания!<br> 
<input type=text size=15 name=name value='
.$_GET['name'].'> 
<br><input type=submit><br>'

if(
preg_match("|^[a-z_]$|i",$_GET['name'])) echo 'Ник введен верно! '.$_GET['name']; 
else echo 
'Ник введен не корректно!'.$_GET['name']; 
?> 


Все работает как должно(то есть пропускаеться только 1 буква или подчеркивание).
А НЕ ЦИФРА пишеться так: [\d]

  Ответить  
 
 автор: Гавриленко Дмитрий   (21.07.2010 в 16:40)   письмо автору
 
   для: tvv123456   (21.07.2010 в 16:01)
 

Спасибо. но в начале у меня был вопрос, зачем "|" в начале и конце?
Обязательно в начале ставить "^" а в конце "$"

  Ответить  
 
 автор: tvv123456   (21.07.2010 в 17:57)   письмо автору
 
   для: Гавриленко Дмитрий   (21.07.2010 в 16:40)
 

Ну не заморачиваясь | - начало и конец выражения(кстати это не единственный символ, можно также использовать / и др.)
^$-обозначают начало и конец строки(или что-то в этом роде)

  Ответить  
 
 автор: Гавриленко Дмитрий   (21.07.2010 в 18:17)   письмо автору
 
   для: tvv123456   (21.07.2010 в 17:57)
 

Спасибо. Буду знать!

  Ответить  
 
 автор: mihdan   (22.07.2010 в 10:52)   письмо автору
 
   для: Гавриленко Дмитрий   (21.07.2010 в 16:40)
 

>зачем "|" в начале и конце
Для обертки всего выражения, чтобы показать границы, можно вместо них поставить "/", "#" ...

  Ответить  
 
 автор: Гавриленко Дмитрий   (24.07.2010 в 00:25)   письмо автору
 
   для: Гавриленко Дмитрий   (21.07.2010 в 15:12)
 

Что бы не создавать новой темы... и опять решил уточнить!
Вот к примеру, проверка e-mail на корректность...

"|^[-0-9a-z_]+@[-0-9-a-z^\.]+\.[a-z]{2,6}$|i"


Зачем нужен спецсимвол ^ в проверке доменного имени?
Ведь как известно ^ - это позиция в начале строки....
Или ^ говорит что точки в доменном имени присутствовать не должно?!

  Ответить  
 
 автор: neadekvat   (24.07.2010 в 00:36)   письмо автору
 
   для: Гавриленко Дмитрий   (24.07.2010 в 00:25)
 

Почитайте-ка вы про рег.выражения.. Кстати говоря, по-моему, тут закралась ошибка.
Если бы ^ стоял в начале класса [^some]- это бы означало, что все остальные символы, описанные в классе, запрещены. Но т.к. ^ стоит дальше [some^]- ^ просто является одним из разрешенных символов.

  Ответить  
 
 автор: Гавриленко Дмитрий   (24.07.2010 в 00:48)   письмо автору
 
   для: neadekvat   (24.07.2010 в 00:36)
 

Дык я читаю.... но это не может просто быть! хоть раз видели url с ^? Я нет! Пример взят из книги PHP5/6 третье издание

  Ответить  
 
 автор: neadekvat   (24.07.2010 в 01:03)   письмо автору
 
   для: Гавриленко Дмитрий   (24.07.2010 в 00:48)
 

А запустить пару тестов что вам мешает?

  Ответить  
 
 автор: Гавриленко Дмитрий   (24.07.2010 в 01:07)   письмо автору
 
   для: neadekvat   (24.07.2010 в 01:03)
 

В смысле?

  Ответить  
 
 автор: neadekvat   (24.07.2010 в 11:30)   письмо автору
 
   для: Гавриленко Дмитрий   (24.07.2010 в 01:07)
 

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

  Ответить  
 
 автор: Гавриленко Дмитрий   (24.07.2010 в 12:52)   письмо автору
 
   для: neadekvat   (24.07.2010 в 11:30)
 

А... вон вы о чем...

  Ответить  
 
 автор: Гавриленко Дмитрий   (24.07.2010 в 19:55)   письмо автору
 
   для: Гавриленко Дмитрий   (21.07.2010 в 15:12)
 

Опять рег. выражения поставили меня в небольшой тупик. К сказал один мудрый человек в этой теме "тестируй, ибо теория без практики не что!" Так вот... Начал тестировать... Курс валют сграбить решил!

Вот сам код




<?php
$contents 
file_get_contents("http://bankir.ru/kurs");
$preg_d "|Курс доллара США</a></h1></td><td width=\"100\"><b>(.*?)</b></td>|i";
$preg_e "|Курс Евро</a></h1></td><td width=\"100\"><b>(.*?)</b></td>|i";
if(
preg_match($preg_d,$contents,$dollar) && preg_match($preg_e,$contents,$evro))
{
    
$kurs[] = 'Курс доллара США: '.$dollar['1'];
    
$kurs[] = 'Курс евро: '.$evro['1'];
}
if(isset(
$kurs))
{
    foreach(
$kurs as $kur)
    {
        echo 
"$kur<br>";
    }
}
?>

Если что, где не правильно, вы строку подскажите, я сам постараюсь найти.

  Ответить  
 
 автор: Trianon   (24.07.2010 в 21:10)   письмо автору
 
   для: Гавриленко Дмитрий   (24.07.2010 в 19:55)
 

Вас губят (не только в этом примере, и не только Вас - тут подобных случаев вообще большинство) вот такие фрагменты шаблона
.*?


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

  Ответить  
 
 автор: Гавриленко Дмитрий   (24.07.2010 в 23:20)   письмо автору
 
   для: Trianon   (24.07.2010 в 21:10)
 

Ну вот к примеру...

<?php
$contents 
file_get_contents("http://bankir.ru/kurs");
$preg_d "|Курс доллара США</a></h1></td><td width=\"100\"><b>[\d]*\.[\d]*</b></td>|isU";
//$preg_e = "|Курс Евро</a></h1></td><td width=\"100\"><b>(\d)*</b></td>|isU";
if(preg_match($preg_d,$contents,$dollar))
{
    echo 
'go';
}
?>


тоже не работает. Хотя я тут определенно дал знать, что результатом может быть несколько
цифр, потом обязательно точка, после которой опять может быть несколько цифр.

  Ответить  
 
 автор: Trianon   (24.07.2010 в 23:35)   письмо автору
 
   для: Гавриленко Дмитрий   (24.07.2010 в 23:20)
 

Я там вижу совершенно иной фрагмент
    <tr class="odd">
                    <td><h1><a href="http://bankir.ru/kurs/abs/840">Курс доллара США</a></h1></td>
                    <td width="100"><b>30.3839</b></td>
    

  Ответить  
 
 автор: Гавриленко Дмитрий   (24.07.2010 в 23:45)   письмо автору
 
   для: Trianon   (24.07.2010 в 23:35)
 

>Я там вижу совершенно иной фрагмент
>
    <tr class="odd">
>                    <td><h1><a href="http://bankir.ru/kurs/abs/840">Курс доллара США</a></h1></td>
>                    <td width="100"><b>30.3839</b></td>
>    




Ну я просто не взял
<tr class="odd">
                    <td><h1><a href="http://bankir.ru/kurs/abs/840">

  Ответить  
 
 автор: Trianon   (25.07.2010 в 00:41)   письмо автору
 
   для: Гавриленко Дмитрий   (24.07.2010 в 23:45)
 

а по-моему Вы просто не взяли еще и некоторые пробльные символы, что в конечном итоге и породило фэйл.

  Ответить  
 
 автор: neadekvat   (25.07.2010 в 12:35)   письмо автору
 
   для: Гавриленко Дмитрий   (24.07.2010 в 23:45)
 

Говоря что теория без практики мертва я имел в виду, что теорию надо проверять на практике, а не то, что надо практиковаться без теории.
Перенос строки относится к пробельным символам. Но там вообще есть еще некоторые нюансы типа того, входил ли перенос в "точку" и при каких модификаторах и т.д.

  Ответить  
 
 автор: Гавриленко Дмитрий   (24.07.2010 в 23:25)   письмо автору
 
   для: Trianon   (24.07.2010 в 21:10)
 

И кстати, можно ли вообще в моем примере, тот который по ближе, использовать квадратные скобки? Вот блин.... почему все это я спрашиваю на форуме, почему все это нельзя было написать в книге. Только понятия дают и все! А там разбирайся сам как хочешь!!! Книга PHP5/6 Третье издание

  Ответить  
 
 автор: neadekvat   (25.07.2010 в 14:53)   письмо автору
 
   для: Гавриленко Дмитрий   (24.07.2010 в 23:25)
 

В этом форуме не раз прозвучало, что для понимания Рег. выражений читайте Фридла

  Ответить  
 
 автор: Гавриленко Дмитрий   (26.07.2010 в 12:17)   письмо автору
 
   для: neadekvat   (25.07.2010 в 14:53)
 

А какие регулярные выражения используются в этой книге? Perl или POSIX?

  Ответить  
 
 автор: neadekvat   (26.07.2010 в 12:54)   письмо автору
 
   для: Гавриленко Дмитрий   (26.07.2010 в 12:17)
 

К чему этот вопрос? Лучше книги по рег.выражениям вы не найдете. Качайте и читайте. Носом еще воротить будут, совсем уже..

  Ответить  
 
 автор: Гавриленко Дмитрий   (26.07.2010 в 13:08)   письмо автору
 
   для: neadekvat   (26.07.2010 в 12:54)
 

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

  Ответить  
 
 автор: neadekvat   (26.07.2010 в 14:20)   письмо автору
 
   для: Гавриленко Дмитрий   (26.07.2010 в 13:08)
 

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

  Ответить  
 
 автор: Гавриленко Дмитрий   (26.07.2010 в 16:37)   письмо автору
 
   для: neadekvat   (26.07.2010 в 14:20)
 

Да... помню. А в php метасимволы \< и \> доступны? Их можно использовать?

  Ответить  
 
 автор: neadekvat   (26.07.2010 в 18:37)   письмо автору
 
   для: Гавриленко Дмитрий   (26.07.2010 в 16:37)
 

Опять вы спрашиваете то, что можно проверить парой тестов.

  Ответить  
 
 автор: Гавриленко Дмитрий   (26.07.2010 в 18:47)   письмо автору
 
   для: neadekvat   (26.07.2010 в 18:37)
 

Да... опять облажался... Вот мне как раз понадобились эти метасимволы. В предложение надо найти к примеру слово "Я". Имеется предложение "Привет, Я юзаю яндекс." Мне надо проверить есть ли в предложение то самое слово "я" в тексте. Вот были бы в php \< и \> то без проблем, но их нет! Что делать если использовать preg_match?

  Ответить  
 
 автор: neadekvat   (26.07.2010 в 21:23)   письмо автору
 
   для: Гавриленко Дмитрий   (26.07.2010 в 18:47)
 

Вы хотите показать конец слова или что?

  Ответить  
 
 автор: Гавриленко Дмитрий   (27.07.2010 в 00:08)   письмо автору
 
   для: neadekvat   (26.07.2010 в 21:23)
 

Нет. Мне надо проверить есть это слово или нет!
Можно было бы воспользоваться "|[\<я\>]|i"
То есть искать слово. Но в php нет \< и \> так что... Чем воспользоваться?

  Ответить  
 
 автор: neadekvat   (27.07.2010 в 00:51)   письмо автору
 
   для: Гавриленко Дмитрий   (27.07.2010 в 00:08)
 

\b указывает на конец слова.

  Ответить  
 
 автор: Гавриленко Дмитрий   (25.07.2010 в 14:42)   письмо автору
 
   для: Гавриленко Дмитрий   (21.07.2010 в 15:12)
 

Добавьтесь пожалуйста ко мне пожалуйста в ICQ. А то на сайте с общением не очень быстро...
ICQ 62996218

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования