[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Поиск по условию
dadli
приветствую
вот здес
http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%....B2.D0.B8.D1.8E

читаю
Цитата
?(n)то|иначе) Если n-я группа вернула значение, то поиск по условию выполняется по шаблону то, иначе по шаблону иначе.


$str = "asdf";
if (preg_match("#([0-9])(?(1)t|f)#",$str)) {
echo "yes";
}



почему нет совпадение в скрипте? в строке же нет ни один цифр, значит нада выполнятся: "иначе", а "иначе" ето символ f да? етот символ есть в строке, почему же нет совпадение? что я не так понимаю?



Спустя 3 минуты, 47 секунд (15.12.2011 - 00:19) Winston написал(а):
У тебя стоит в шаблоне
Цитата (dadli @ 14.12.2011 - 23:16)
([0-9])
потому цифра обязательна.

Спустя 7 минут, 2 секунды (15.12.2011 - 00:26) dadli написал(а):
но если будит цифр в строке, значит НИКОГДА не будит виполнятся условие "иначе", ето же так?

Спустя 9 минут, 41 секунда (15.12.2011 - 00:36) Winston написал(а):
Ну вот смотри пример
$str = "1 есть";
if (preg_match("#(1)? (?(1)есть|нету)#u",$str)) {
echo "yes";
}

Здесь мы ищем единицу. Если единица есть, то за ней должно стоять слово есть, Иначе если будет другая цифра, отличная от единицы, то за ней должно быть слово нету. Вот так.

Спустя 14 минут, 35 секунд (15.12.2011 - 00:51) dadli написал(а):
Winston
$str = "1 нету";
if (preg_match("#(1)? (?(1)есть|нету)#u",$str)) {
echo "yes";
}


а почему ето воведит "yes" ? должно виполнить условие если, в етом условие нет слово "нету", но совпадение все ровно есть почемута :huh:

Спустя 22 часа, 34 минуты, 6 секунд (15.12.2011 - 23:25) duhon написал(а):
Цитата (dadli @ 14.12.2011 - 21:51)
Winston

if (preg_match("#(1)? (?(1)есть|нету)#u",$str)) {
echo "yes";
}


а почему ето воведит "yes" ? должно виполнить условие если, в етом условие нет слово "нету", но совпадение все ровно есть почемута :huh:

потому что ты его не заякорил
$str = "1 нету";
if (preg_match("#^(1)? (?(1)есть|нету)#u",$str)) {
echo "yes";
}


в твоей регулярке первый вариант и правда возвращает fasle, но регулярка будет искать дальше, а текст $str = " нету" подходит под условие

Спустя 34 минуты, 15 секунд (15.12.2011 - 23:59) dadli написал(а):
duhon
ага ясно спасибо огромное

Спустя 2 дня, 16 часов, 12 минут, 50 секунд (18.12.2011 - 16:12) duhon написал(а):
чего то меня вдохновил этот вопрос, хочу поделиться личными наблюдениями об подмасках(подгрупах, групах, подшаблонах, подпатернах и другие синонимы)

(patern) или (?:patern) - это подмаски.

для движка PCRE это что то типа функция или подпрограмма.
также как и в php функции имеют входящие и исходящие агрументы.

(patern) - эту конструкцию в php можно было бы выразить наподобии следущего
$patern_1 = function($patern, $text){preg_match($patern, $text, $result); return $result[0];}
$text - это данные которые регулярка еще не обработала.
$patern - это сама регулярка которая написана в подмаске.
$patern_1 - это переменная в которую сохраняеться результат, мы позже можем к ней обращаться например так \1 или по новому \g{1}

Конструкция (?:patern) это аналогично предыдущему варианту(patern) только без сохранения результата в переменную.

Теперь интересный нюанс, подмаски могут возращать всего три типа переменных:
1) String - текст который нашла регулярка, должна иметь хотябы 1 символ
2) Null - нулевая длинна совпадения, это string но без символов (как в php пустой стринг $patern_1 = '')
3) False - регулярка ничего не нашла, а Null по условию не считаеться удовлетворительной

Примеры:
preg_match('/^(abc)/', 'abc') - тут в первой группе(\1) будет текст String abc, preg_match вернет true
preg_match('/^(abc)/', 'abv') - тут в первой группе(\1) будет текст False, preg_match вернет false
preg_match('/^(abc)?/', 'abv') - тут в первой группе(\1) будет текст Null, preg_match вернет true

False заставляет регулярку двигаться назад, тоесть искать альтернативные пути, что бы обойти false.
Null позволяет регулярке двигаться вперед как будьто и не было никаких препятствий на пути
String позволяет регулярке двигаться вперед сдвинув курсор за найденным текстом.

Теперь посмотрим на условную подмаску (?(1)есть|нету)
(1) - это заглядывание на переменную $patern_1.
аналогия с php if(empty($patern_1))
конструкция if может вернуть только булевое значение true или false.
- если переменная $patern_1 не существует то результат будет False
- если на входе будет string хотябы с 1 символом то результат true
- если на входе будет Null то результат будет False
- если на входе будет False то на выходе тоже будет False, хотя последние в условной подмаске не может быть, так как false не далбы регулярке дойти до условной подмаски.

Мой личный вывод:
В регулярах подмаски это аналог подпрограмм, с входящими и исходящими аргументами.


_____________


когда чарли чаплин принимал участие в конкурсе: "клон чарли чаплинов", то чарли занимал третю позицию.

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.