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

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

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

 

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

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

тема: Первое совпадение
 
 автор: opex   (30.06.2006 в 12:32)   письмо автору
 
 

Как в регулярном выражении сделать так, чтобы оно только если не нашло один текст, то начинало искать другой? (то есть если бы нашло первый текст, то второй бы уже не искало).

Короче надо чтобы если есть определенная строчка, то нашло бы текст до нее и все. А если ее нет, то чтобы искало до второй определенной строчки.

   
 
 автор: cheops   (30.06.2006 в 18:50)   письмо автору
 
   для: opex   (30.06.2006 в 12:32)
 

Используйте функцию preg_match() - она находит только первое соответствие.

   
 
 автор: opex   (30.06.2006 в 18:56)   письмо автору
 
   для: cheops   (30.06.2006 в 18:50)
 

Вот мой код:

preg_match("/$_1(.*)($_3|$_2)/is", $str, $out);


Мне нужно, чтобы сначала было найдено соответствие $_3, а если его нет, то $_2.
PHP же в любои случае игнорирует $_3 и находит $_2.

   
 
 автор: cheops   (30.06.2006 в 18:58)   письмо автору
 
   для: opex   (30.06.2006 в 18:56)
 

Приведите значение $out, чтобы можно было воспроизвести ситуацию.

   
 
 автор: opex   (30.06.2006 в 20:20)   письмо автору
 
   для: cheops   (30.06.2006 в 18:58)
 

$out здесь принципиально ничего не значит. Вот что написано в документации:

Вертикальная черта

Символ вертикальной черты '|' используются для разделения альтернативных масок. Например шаблон gilbert|sullivan соответствует как "gilbert" так и "sullivan". Допустимо указывать любое количество альтернатив, также допустимо указывать пустые альтернативы (соответствуют пустой строке). В процессе поиска соответствия просматриваются все перечисленные альтернативы слева направо, останавливаясь после первого найденного соответствия. В случае, если альтернативные варианты перечислены в подшаблоне, то поиск соответствия означает нахождение соответствия одному из альтернативных вариантов подмаски и остатку основного шаблона.

А у меня альтернативные варианты перечислены в подшаблоне, т е в круглых скобках, и почему-то всегда отдается предпочтение второму варианту..
Мне надо, чтобы было слева направо до первого совпадения.

   
 
 автор: opex   (02.07.2006 в 11:27)   письмо автору
 
   для: opex   (30.06.2006 в 20:20)
 

Помогите кто-нибудь, пожалуйста.

   
 
 автор: cheops   (02.07.2006 в 11:52)   письмо автору
 
   для: opex   (02.07.2006 в 11:27)
 

Погодите, у вас что находится в переменных $_1, $_2 и $_3?

   
 
 автор: opex   (02.07.2006 в 13:58)   письмо автору
 
   для: cheops   (02.07.2006 в 11:52)
 

Текст у меня там находится.

   
 
 автор: cheops   (02.07.2006 в 16:06)   письмо автору
 
   для: opex   (02.07.2006 в 13:58)
 

Текст не содержит спец-символов, если содержит, лучше пропустить эти значения через функцию preg_quote()
preg_match("/".preg_quote($_1)."(.*)(".preg_quote($_3)."|".preg_quote($_2).")/is", $str, $out);

   
 
 автор: opex   (02.07.2006 в 18:42)   письмо автору
 
   для: cheops   (02.07.2006 в 16:06)
 

Все спец символы экранированы.

   
 
 автор: opex   (02.07.2006 в 18:47)   письмо автору
 
   для: opex   (02.07.2006 в 18:42)
 

Я думаю, вы не до конца поняли проблему.
Если я пишу

<?php 
preg_match
("/$_1(.*)$_2/is"$str$out);
echo 
$out[1];
?>

То выводится текст от $_1 до $_2.
Если я пишу

<?php 
preg_match
("/$_1(.*)$_3/is"$str$out);
echo 
$out[1];
?>

То выводится текст от $_1 до $_3.
Если я пишу

<?php 
preg_match
("/$_1(.*)($_2|$_3)/is"$str$out);
echo 
$out[1];
?>

То выводится текст от $_1 до $_2, а мне надо чтобы вывелся текст от $_1 до $_3, а если переменная $_3 не найдена, то вывелся бы текст от $_1 до $_2.
В тексте $_3 идет первее, то есть выше, чем $_2.

   
 
 автор: cheops   (03.07.2006 в 00:08)   письмо автору
 
   для: opex   (02.07.2006 в 18:47)
 

Понятно, попробуйте добавить модификатор U
<?php 
preg_match
("/$_1(.*)($_2|$_3)/isU"$str$out); 
echo 
$out[1]; 
?>

или использовать следующее регулярное выражение
<?php 
preg_match
("/$_1(.*?)($_2|$_3)/is"$str$out); 
echo 
$out[1]; 
?>

   
 
 автор: opex   (03.07.2006 в 08:49)   письмо автору
 
   для: cheops   (03.07.2006 в 00:08)
 

Огромное спасибо, работает!
Объясните, пожалуйста, как вам это удалось?
На что повлиял этот пресловутый "?"?

   
 
 автор: cheops (из кафе)   (03.07.2006 в 10:26)
 
   для: opex   (03.07.2006 в 08:49)
 

U - или последовательности .*? .+? - инвертируют "жадность". Дело в том, что по умолчанию регулярные выражения "жадные" и стараются найти как можно более длинное соответствие регулярному выражению. Если мы применяем один из этих символов, мы делаем их "не жадными" - они стараются найти как можно более короткое соответствие. U - глобально изменяет жадность для всего регулярного выражения, а .*? и .+? локально только для .* и .+, соответственно.

   
Rambler's Top100
вверх

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