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

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

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

 

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

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

тема: Регулярные выражения - русский и английский текст
 
 автор: Ametis   (28.08.2005 в 21:31)   письмо автору
 
 

Вот у меня есть код:

<?php
  $stroka 
"latinitsa";
  if (!
preg_match("/[-0-9a-z_]+/i",$stroka ))  
  
$str="Нет соответствия с регулярным варажением"."<br>";
  else 
$str="Есть соответствие с регулярным выражением"."<br>";
echo(
"$str")
  
?>


Как видно из кода шаблон соответствуе набору цифер от 0 до 9 и латинских строчных букв от a до z плюс знак минуса и знак подчеркивания. Пока после скобки ] стоит знак плюса все работает нормально. Но как только подставляю метасимволы * или ? код начинае работать некорректно. Например при замене + на * код считает что $stroka = "кирилица";соответствует регулярному выражению и выводит сообщение о том что найдено соответствие. То же самое и со знаком "?" только до кучи при это интерпритатор считает что многократное повторение латинских символов соответствует регу? В чем тут дело ??? Помогите разобраться !

   
 
 автор: @ndry   (28.08.2005 в 21:39)   письмо автору
 
   для: Ametis   (28.08.2005 в 21:31)
 

--

   
 
 автор: Евгений Петров   (28.08.2005 в 23:17)   письмо автору
 
   для: Ametis   (28.08.2005 в 21:31)
 

Знак звездочка ищет ноль или более вхождений т.е. в твоем случае раз ничего не было найдено, значит все правильно, а вопросительный знак ищет ноль или один, т.е. тоже самое т.к. ничего не найдено возвращает положительный результат.

   
 
 автор: cheops   (29.08.2005 в 01:17)   письмо автору
 
   для: Евгений Петров   (28.08.2005 в 23:17)
 

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

   
 
 автор: Ametis   (29.08.2005 в 09:34)   письмо автору
 
   для: Евгений Петров   (28.08.2005 в 23:17)
 

Евгений, а вы пробовали этот код, у вас он работает правильно? Например я тестирую следующий код:

<?php 
  $stroka 
"абвгдеж"
  if (!
preg_match("/[-0-9a-z_]*/i",$stroka ))   
  
$str="Нет соответствия с регулярным варажением"."<br>"
  else 
$str="Есть соответствие с регулярным выражением"."<br>"
echo(
"$str"
  
?> 

В соответствии с правилами $stroka = "абвгдеж"; не соответствует регу, тем не менее пишет что "Есть соответствие с регулярным выражением". Каким образом он находит соответствие с регом, когда в рег.выражении обозначены только латинские символы а в сравниваемой строке стоят символы кирилицы??? Может у меня что то с кодировкой не то, я работаю в EditPlus

   
 
 автор: cheops   (29.08.2005 в 11:48)   письмо автору
 
   для: Ametis   (29.08.2005 в 09:34)
 

Для работы с русским текстом, необходимо настроить русскую локаль, подробности в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=6084

   
 
 автор: Artem S.   (29.08.2005 в 12:05)   письмо автору
 
   для: Ametis   (29.08.2005 в 09:34)
 

Вы не пытаетесь понять
/[-0-9a-z_]+/i ищет эти символы в тексте. И выдаст true даже если будит 1 символ из этого диапазона. Скажем ***0***. Он найдет "0", а значит выражение верно.
/[-0-9a-z_]*/i не даст ни каких результатов. Он "нашел" 0 вложений, при этом никаких противоречий не было.
Чтобы добиться того, что хотите вы, необходимо обозначить конец и начало строки.
/^[-0-9a-z_]+$/i Здесь будит поиск "строки" из заданных символов.

   
 
 автор: Ametis   (29.08.2005 в 12:42)   письмо автору
 
   для: Artem S.   (29.08.2005 в 12:05)
 

Правильно ли я понял, что код

 $stroka = "абвгдеж"; 
  if (preg_match("/[-0-9a-z_]*/i",$stroka ))    
  

вернет TRUE из за того что он не найдет ни одного соответствия, что не противоречит метасимвалу * ?

   
 
 автор: Artem S.   (29.08.2005 в 12:48)   письмо автору
 
   для: Ametis   (29.08.2005 в 12:42)
 

Он "найдет" не одного соответствия. То, что не противоречит выражению - то истина.
Смысл вы уловили.

   
 
 автор: Ametis   (29.08.2005 в 13:02)   письмо автору
 
   для: Artem S.   (29.08.2005 в 12:48)
 

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

   
 
 автор: Ametis   (29.08.2005 в 18:22)   письмо автору
 
   для: Artem S.   (29.08.2005 в 12:48)
 

Подскажите, а существут ли в регулярных выражения символ пустоты, незаполненности поля? Я вот эту задачу решил с помощью функции empty(). Но может быть в рег. выражениях есть символ пустоты, тогда решение было бы намного изящнее ?

   
 
 автор: Евгений Петров   (29.08.2005 в 18:27)   письмо автору
 
   для: Ametis   (29.08.2005 в 18:22)
 

Ничего изящного я тут не вижу регулярные выражения работают намного медленнее функции empty или isset

   
 
 автор: Ametis   (29.08.2005 в 18:45)   письмо автору
 
   для: Евгений Петров   (29.08.2005 в 18:27)
 

может быть - я в этом вопросе не такой специалист как вы, Евгений. Но все таки если можете подскажите существует ли символ пустоты в регулярных выражениях или нет ?

   
 
 автор: Евгений Петров   (29.08.2005 в 18:54)   письмо автору
 
   для: Ametis   (29.08.2005 в 18:45)
 

Вряд ли существует такой символ.

   
 
 автор: Artem S.   (29.08.2005 в 19:04)   письмо автору
 
   для: Ametis   (29.08.2005 в 18:45)
 

/^$/

Соответствует пустой строке

   
 
 автор: Ametis   (29.08.2005 в 19:27)   письмо автору
 
   для: Artem S.   (29.08.2005 в 19:04)
 

Да, действительно все работает. Спасибо.

   
 
 автор: cheops   (29.08.2005 в 19:27)   письмо автору
 
   для: Ametis   (29.08.2005 в 18:22)
 

Если вам требуется, чтобы регулярное выражение возвращало true, когда переменная не пустая, и false, когда переменная пустая следует использовать конструкцию []+ (всё-равно что будет в квадратных скобках) - именно эта конструкция предназначена для обозначения "не пустоты".

   
 
 автор: Ametis   (29.08.2005 в 23:15)   письмо автору
 
   для: cheops   (29.08.2005 в 19:27)
 

"[]+" - это не метод для проверки переменой на предмет пустая она или нет, т.к. если переменная не пустая или не совпадает с регулярным выражением, в обоих случаях возвратится false и нам останется гадать: была она пустая или просто строка не совпала с рег.выражением
До сих пор я выяснил два обозначения пустого символа в регулярных выражениях ^$ о котором сказал Artem S и как я обнаружил (). Оба обозначения "пустоты" работают - проверял.Например выражение/a+|()/ выцепляет строки в которых есть хотябы один символ a или строка пустая. То же самое делает выражение /a+|^$/ Для быстрой проверки на соответствие регу пришлось написать небольшой скрипт. Для тех кому интересно привожу его код. Естественно скрипт работает если введено допускаемое регулярное выражение(неплохой способ проверки корректности регулярного выражения ))Скорее всего в это скрипте учтины не все моменты передачи рега через форму, так что не обессудьте если что):

<html>
<head>
<title>Регулярные выражения</title>
</head>
<body bgcolor="#A4FFCD">
<h3 align="center" style="font-family:arial; font-size:18px;">Проверка строк на соответствие регулярному выражению</h3>
<form name="my" method="post" > 
<table border="0" align="center" style="font-family:arial; font-size:18px; font-style:italic">
   <tr>
     <td>Регулярное выражение:</td>
     <td><input type="text" name="reg" size="50"></td>
   </tr>
   <tr>
     <td>Сравниваемая строка:</td>
     <td><input type="text" name="str" size="50"></td>
   </tr>
   <tr>
     <td>Результат:</td>
     <td><input type="text" name="otv" size="20"></td>
   </tr>
   <tr>
     <td>&nbsp;</td>
     <td><input type="submit" value="Проверить">
   </tr>
 </table>
  </form>
<?php
   $reg 
$_POST['reg'];
   
$str $_POST['str'];
  if (!empty(
$reg))
  {  
     
$reg stripslashes($reg);    
     if (
preg_match("$reg",$str)) 
     echo(
"<script language='javascript'>my.otv.value='Соответствует'</script>");
     else
     echo(
"<script language='javascript'>my.otv.value='Не соответствует'</script>");
  }
  
$reg addslashes($reg);
  echo(
"<script language='javascript'>my.reg.value='{$reg}'</script>");
  
$reg stripslashes($reg);    
  echo(
"<script language='javascript'>my.str.value='{$str}'</script>");
 
?>
 </body>
 </html>

При тестирование различных комбинаци регов, выяснилась еще одно странное поведение регов. Например рег /a{2,4}/ находит совпадение в стр. aaaaa в то время как у него верхняя граница 4 символа a. Можно предположить, что было найдено совпадение по первым двум символам aa, но тогда какой смысл в верхней границе ?

   
 
 автор: Artem S.   (30.08.2005 в 09:40)   письмо автору
 
   для: Ametis   (29.08.2005 в 23:15)
 

В данном примере смысла нет. А вот скажем в таком
/ba{2,4}с/
за "b" идет от 2-х до 4-х "a" затем "с"
В вашем примере вместо "b" и "c" следует использовать символы начала и конца строки.
/^a{2,4}$/
Расшифровывается как, начало строки, за этим идет от 2-х до 4-х "а", затем строка заканчивается.

   
Rambler's Top100
вверх

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