|
|
|
| Вот у меня есть код:
<?php
$stroka = "latinitsa";
if (!preg_match("/[-0-9a-z_]+/i",$stroka ))
$str="Нет соответствия с регулярным варажением"."<br>";
else $str="Есть соответствие с регулярным выражением"."<br>";
echo("$str")
?>
|
Как видно из кода шаблон соответствуе набору цифер от 0 до 9 и латинских строчных букв от a до z плюс знак минуса и знак подчеркивания. Пока после скобки ] стоит знак плюса все работает нормально. Но как только подставляю метасимволы * или ? код начинае работать некорректно. Например при замене + на * код считает что $stroka = "кирилица";соответствует регулярному выражению и выводит сообщение о том что найдено соответствие. То же самое и со знаком "?" только до кучи при это интерпритатор считает что многократное повторение латинских символов соответствует регу? В чем тут дело ??? Помогите разобраться ! | |
|
|
|
|
|
|
|
для: Ametis
(28.08.2005 в 21:31)
| | -- | |
|
|
|
|
|
|
|
для: Ametis
(28.08.2005 в 21:31)
| | Знак звездочка ищет ноль или более вхождений т.е. в твоем случае раз ничего не было найдено, значит все правильно, а вопросительный знак ищет ноль или один, т.е. тоже самое т.к. ничего не найдено возвращает положительный результат. | |
|
|
|
|
|
|
|
для: Евгений Петров
(28.08.2005 в 23:17)
| | Евгений прав, по умолчанию регулярные выражения являются "ленивыми", т.е. они предпочитают найти наименьшее соответствие - если можно найти ничего - они именно это и сделают. Если можно найти один и больше символов, то найдя один символ - они дальше искать не станут. | |
|
|
|
|
|
|
|
для: Евгений Петров
(28.08.2005 в 23:17)
| | Евгений, а вы пробовали этот код, у вас он работает правильно? Например я тестирую следующий код:
<?php
$stroka = "абвгдеж";
if (!preg_match("/[-0-9a-z_]*/i",$stroka ))
$str="Нет соответствия с регулярным варажением"."<br>";
else $str="Есть соответствие с регулярным выражением"."<br>";
echo("$str")
?>
|
В соответствии с правилами $stroka = "абвгдеж"; не соответствует регу, тем не менее пишет что "Есть соответствие с регулярным выражением". Каким образом он находит соответствие с регом, когда в рег.выражении обозначены только латинские символы а в сравниваемой строке стоят символы кирилицы??? Может у меня что то с кодировкой не то, я работаю в EditPlus | |
|
|
|
|
|
|
|
для: Ametis
(29.08.2005 в 09:34)
| | Для работы с русским текстом, необходимо настроить русскую локаль, подробности в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=6084 | |
|
|
|
|
|
|
|
для: Ametis
(29.08.2005 в 09:34)
| | Вы не пытаетесь понять
/[-0-9a-z_]+/i ищет эти символы в тексте. И выдаст true даже если будит 1 символ из этого диапазона. Скажем ***0***. Он найдет "0", а значит выражение верно.
/[-0-9a-z_]*/i не даст ни каких результатов. Он "нашел" 0 вложений, при этом никаких противоречий не было.
Чтобы добиться того, что хотите вы, необходимо обозначить конец и начало строки.
/^[-0-9a-z_]+$/i Здесь будит поиск "строки" из заданных символов. | |
|
|
|
|
|
|
|
для: Artem S.
(29.08.2005 в 12:05)
| | Правильно ли я понял, что код
$stroka = "абвгдеж";
if (preg_match("/[-0-9a-z_]*/i",$stroka ))
|
вернет TRUE из за того что он не найдет ни одного соответствия, что не противоречит метасимвалу * ? | |
|
|
|
|
|
|
|
для: Ametis
(29.08.2005 в 12:42)
| | Он "найдет" не одного соответствия. То, что не противоречит выражению - то истина.
Смысл вы уловили. | |
|
|
|
|
|
|
|
для: Artem S.
(29.08.2005 в 12:48)
| | Но у меня задача чтобы рег. выражение отлавливало либо отсутствие символов, либо латинские символы, либо знак минуса, либо знак подчеркивания, либо цифры - все остальное отбрасывается. В данно случае кирилица не отбрасывается - как исключить ее и все остальное что не перечислено выше? | |
|
|
|
|
|
|
|
для: Artem S.
(29.08.2005 в 12:48)
| | Подскажите, а существут ли в регулярных выражения символ пустоты, незаполненности поля? Я вот эту задачу решил с помощью функции empty(). Но может быть в рег. выражениях есть символ пустоты, тогда решение было бы намного изящнее ? | |
|
|
|
|
|
|
|
для: Ametis
(29.08.2005 в 18:22)
| | Ничего изящного я тут не вижу регулярные выражения работают намного медленнее функции empty или isset | |
|
|
|
|
|
|
|
для: Евгений Петров
(29.08.2005 в 18:27)
| | может быть - я в этом вопросе не такой специалист как вы, Евгений. Но все таки если можете подскажите существует ли символ пустоты в регулярных выражениях или нет ? | |
|
|
|
|
|
|
|
для: Ametis
(29.08.2005 в 18:45)
| | Вряд ли существует такой символ. | |
|
|
|
|
|
|
|
для: Ametis
(29.08.2005 в 18:45)
| |
Соответствует пустой строке | |
|
|
|
|
|
|
|
для: Artem S.
(29.08.2005 в 19:04)
| | Да, действительно все работает. Спасибо. | |
|
|
|
|
|
|
|
для: Ametis
(29.08.2005 в 18:22)
| | Если вам требуется, чтобы регулярное выражение возвращало true, когда переменная не пустая, и false, когда переменная пустая следует использовать конструкцию []+ (всё-равно что будет в квадратных скобках) - именно эта конструкция предназначена для обозначения "не пустоты". | |
|
|
|
|
|
|
|
для: 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> </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, но тогда какой смысл в верхней границе ? | |
|
|
|
|
|
|
|
для: Ametis
(29.08.2005 в 23:15)
| | В данном примере смысла нет. А вот скажем в таком
за "b" идет от 2-х до 4-х "a" затем "с"
В вашем примере вместо "b" и "c" следует использовать символы начала и конца строки.
Расшифровывается как, начало строки, за этим идет от 2-х до 4-х "а", затем строка заканчивается. | |
|
|
|