Лев К: 2. вы можете получить и валидировать дату по формату либо в регулярке, либо всё равно будете её проверять после. Необязательно делать это здесь.
Лев К: да. будете дату как-то использовать и если она будет не по формату, то необходимо выдать ошибку об этом. поэтому, либо вы с помощью регулярки определяете формат, либо позже.
romy4: Можешь подсказать почему условие не выполняется?
строка: 'bbb:28.09.2016'
/(?<=bbb\:)(true)|(false)/
Мне нужно если есть 'bbb:' то true, не нашел bbb - false ... постоянно переходит на false
romy4: ладно ... вот полностью код
$rab = '27.09.2016 | 20:00 bbb: 28.09.2016 | 22:00';
$rab2 = '27.09.2016 | 20.00';
if (preg_match("/(?<=bbb\:\s)([\d\.]{10})|([\d\.]{10})/", $rab, $arr)) var_dump($arr);
if (preg_match("/(?<=bbb\:\s)([\d\.]{10})|([\d\.]{10})/", $rab2, $arr)) var_dump($arr);
В обоих случаях выводить 27.09.2016, а мне нужно для первой строки 28.09.2016, для второй 27.09.2016
В первой строке же должно выполняться (?<=bbb\:\s)([\d\.]{10}) и как следствие зачем ему дальше искать строки, да он и не ищет судя по массиву.
В первом случае он сначала пытается найти ([\d\.]{10}) перед которым идёт (?<=bbb\:\s). не находит bbb и переходит к условию ([\d\.]{10}) под него уже попадает 27.09.2016 - его и возвращает. Регулярка проверяет посимвольно слева направо, сравнивая с каждым символом оба условия. То есть иными словами регулярка не ищет сперва одну часть себя, а дотом другую, она сразу ищет обе и что раньше попадётся — то и будет
Лев К: я бы по рекомендовал сперва делать strpos($rab,"bbb:") и если оно положительно, то матчить часть "(?<=bbb\:\s)([\d\.]{10})", а иначе матчить "([\d\.]{10})".
Лев К: чем проще, тем лучше. регулярки - не панацея, а время затраченное на strpos мизерно по сравнению с тем, сколько будет тратить неправильная (если вдруг) регулярка с кучей ветвлений