слово1 всякаяфигня ххххх всякаяфигня слово2
слово1 всякаяфигня слово2
Тут
слово1, слово2 и ххххх — четко известны;
всякаяфигня — это любые символы или полное их отсутствие
Мне надо найти только те строки, где нет последовательности ххххх, а слово1 и слово2 есть (слово1 идет перед слово2).
Конечно, можно сначала найти (слово1)(.*)(слово2), а потом анализировать, содержит ли строка ххххх. Но можно ли это описать одним РВ, чтобы все делалось за один вызов ф-ии preg_match_all()?
Шо-то меня переклинило, не получается. Да и чайник я в РВ пока.Помогите пожалуйста!
Спустя 41 минута, 37 секунд (26.09.2010 - 12:48) DedMorozzz написал(а):
#word1.*?xxxx.*?word2#
Спустя 24 минуты, 26 секунд (26.09.2010 - 13:13) qwerty2010 написал(а):
Цитата (DedMorozzz @ 26.09.2010 - 09:48) |
#word1.*?xxxx.*?word2# |
Так оно распознает
слово1 всякаяфигня ххххх всякаяфигня слово2
а мне надо наоборот, чтоб выдавало true, там где ххххх нету, т.е. надо чтоб вот эти строки были выданы:
слово1 всякаяфигня слово2
Спустя 48 минут, 5 секунд (26.09.2010 - 14:01) DedMorozzz написал(а):
ну инвертируй. Если найдено - ошибка.
Спустя 1 час, 28 минут, 1 секунда (26.09.2010 - 15:29) qwerty2010 написал(а):
Цитата (DedMorozzz @ 26.09.2010 - 11:01) |
ну инвертируй. Если найдено - ошибка. |
Что инвертировать? Не работает ваш вариант как надо

$pattern = "#word1.*?xxxxx.*?word2#";
$s1 = "word1 всякаяфигня ххххх всякаяфигня word2";
$s2 = "word1 всякаяфигня word2";
$s3 = "word1 всякаяфигня otherword";
preg_match_all($pattern, $s1, ...) —> true
preg_match_all($pattern, $s2, ...) —> false
preg_match_all($pattern, $s3, ...) —> false
т.е. инверсия сделает строку $s3 правильной. А правильная тут только $s2. Мне надо, чтобы из этих трех строк true было только для $s2.
Спустя 36 минут, 35 секунд (26.09.2010 - 16:06) netruxa написал(а):
может
#word1[^xxxx]+?word2#
?
#word1[^xxxx]+?word2#
?
Спустя 20 минут, 8 секунд (26.09.2010 - 16:26) qwerty2010 написал(а):
Цитата (netruxa @ 26.09.2010 - 13:06) |
может #word1[^xxxx]+?word2# ? |
Да не, не работает... Я уже подозреваю, что одним регулярым выражением (одним вызовом preg_match_all) тут не отделаешься. Ну, из двух последоватеьных вызовов — это и коню понятно как делать. Но хочется одним вызовом. Надо именно одним и позарез! Что скажут гуру пихиписткие? Можно за один вызов решить проблему?
Спустя 2 часа, 31 минута, 55 секунд (26.09.2010 - 18:58) DedMorozzz написал(а):
завтра напишу.
Спустя 15 часов, 24 минуты, 40 секунд (27.09.2010 - 10:22) DedMorozzz написал(а):
[^xxxx] - это инвертирует символьный класс, а никак не слово.
По теме :
Первое, что в голову пришло, через колбек:
Чуток попозжее может и проще придумаю
По теме :
Первое, что в голову пришло, через колбек:
<?php
$s1 = "word1 zzz ххх yyy word2";
$s2 = "word1 jjj word2";
$s3 = "word1 ooo otherword";
$a= preg_replace_callback('#word1.*word2#',create_function('$matches','
$b = strpos($matches[0],\'ххх\');
if (!empty($) return "false";
else return "true";
'),$s2);
echo $a;
Чуток попозжее может и проще придумаю