|
|
|
| Как в регулярном выражении сделать так, чтобы оно только если не нашло один текст, то начинало искать другой? (то есть если бы нашло первый текст, то второй бы уже не искало).
Короче надо чтобы если есть определенная строчка, то нашло бы текст до нее и все. А если ее нет, то чтобы искало до второй определенной строчки. | |
|
|
|
|
|
|
|
для: opex
(30.06.2006 в 12:32)
| | Используйте функцию preg_match() - она находит только первое соответствие. | |
|
|
|
|
|
|
|
для: cheops
(30.06.2006 в 18:50)
| | Вот мой код:
preg_match("/$_1(.*)($_3|$_2)/is", $str, $out);
|
Мне нужно, чтобы сначала было найдено соответствие $_3, а если его нет, то $_2.
PHP же в любои случае игнорирует $_3 и находит $_2. | |
|
|
|
|
|
|
|
для: opex
(30.06.2006 в 18:56)
| | Приведите значение $out, чтобы можно было воспроизвести ситуацию. | |
|
|
|
|
|
|
|
для: cheops
(30.06.2006 в 18:58)
| | $out здесь принципиально ничего не значит. Вот что написано в документации:
Вертикальная черта
Символ вертикальной черты '|' используются для разделения альтернативных масок. Например шаблон gilbert|sullivan соответствует как "gilbert" так и "sullivan". Допустимо указывать любое количество альтернатив, также допустимо указывать пустые альтернативы (соответствуют пустой строке). В процессе поиска соответствия просматриваются все перечисленные альтернативы слева направо, останавливаясь после первого найденного соответствия. В случае, если альтернативные варианты перечислены в подшаблоне, то поиск соответствия означает нахождение соответствия одному из альтернативных вариантов подмаски и остатку основного шаблона.
|
А у меня альтернативные варианты перечислены в подшаблоне, т е в круглых скобках, и почему-то всегда отдается предпочтение второму варианту..
Мне надо, чтобы было слева направо до первого совпадения. | |
|
|
|
|
|
|
|
для: opex
(30.06.2006 в 20:20)
| | Помогите кто-нибудь, пожалуйста. | |
|
|
|
|
|
|
|
для: opex
(02.07.2006 в 11:27)
| | Погодите, у вас что находится в переменных $_1, $_2 и $_3? | |
|
|
|
|
|
|
|
для: cheops
(02.07.2006 в 11:52)
| | Текст у меня там находится. | |
|
|
|
|
|
|
|
для: opex
(02.07.2006 в 13:58)
| | Текст не содержит спец-символов, если содержит, лучше пропустить эти значения через функцию preg_quote()
preg_match("/".preg_quote($_1)."(.*)(".preg_quote($_3)."|".preg_quote($_2).")/is", $str, $out);
|
| |
|
|
|
|
|
|
|
для: cheops
(02.07.2006 в 16:06)
| | Все спец символы экранированы. | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|
|
|
|
для: 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];
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(03.07.2006 в 00:08)
| | Огромное спасибо, работает!
Объясните, пожалуйста, как вам это удалось?
На что повлиял этот пресловутый "?"? | |
|
|
|
|
автор: cheops (из кафе) (03.07.2006 в 10:26) |
|
|
для: opex
(03.07.2006 в 08:49)
| | U - или последовательности .*? .+? - инвертируют "жадность". Дело в том, что по умолчанию регулярные выражения "жадные" и стараются найти как можно более длинное соответствие регулярному выражению. Если мы применяем один из этих символов, мы делаем их "не жадными" - они стараются найти как можно более короткое соответствие. U - глобально изменяет жадность для всего регулярного выражения, а .*? и .+? локально только для .* и .+, соответственно. | |
|
|
|