Регулярное выражение и исключение

Регулярное выражение и исключение

Добрый вечер!

1. Натолкните на мысль пожайлуста, как исключить повторение напр. <!-- END BLOCK yo --> в строке $in между <!-- BEGIN BLOCK yo --><!-- END BLOCK yo --><!-- END BLOCK yo -->? 2. Скажите, каким оператором регулярных выражений воспользоваться?

PHP:
$blockname="yo";
$in = "Hello<!-- BEGIN BLOCK yo --><!-- END BLOCK yo --><!-- END BLOCK yo -->Buy";
preg_match("~(.*)<!-- BEGIN BLOCK (".$blockname.") -->[^<!-- END BLOCK yo -->]*<!-- END BLOCK (\\2) -->(.*)~",$in,$matches);
print_r($matches);
3. Понимаю что в "[" и "]" заключаются литералы и с помощью "^" можно исключить совпадение n количества раз с помощью "*", но если это не литерал, а подстрока неразрывного текста <!-- END BLOCK yo -->, то как его исключить n количество раз? 4. Пробовал ретроспективные и опережающие проверки, но они ИМХО используються для указания конкретного текста, который должен/не должен идти перед/после искомой подстроки. Они могут помочь в решении моей проблемы?

Заранее огромное спасибо всем кто откликнется.
 

sakon

П..и.н..ок
Одной регуляркой не обойдешся.
Что то вроде
PHP:
<?php
$in = "Hello<!-- BEGIN BLOCK yo --> hkhk kehjl ,hkj <!-- END BLOCK yo -->erggeg trytr rtyrt rtyurtt  <!-- END BLOCK yo -->tjt6j utt tyut tu6tuu tyujj ytuj u <!-- END BLOCK yo -->Buy";
preg_match('/(Hello<!-- BEGIN BLOCK yo -->)(.*?)(<!-- END BLOCK yo -->Buy)/i',$in,$d);
$f = preg_replace('/<!-- END BLOCK yo -->/','',$d[2]);
echo $d[1].$f.$d[3];

?>
 
sakon
В том то и проблема, что не надо ничего реплейсить, а просто выбрать первый совпавший <!-- BEGIN BLOCK yo --> , превый совпавший <!-- END BLOCK yo --> и всё что перед, между и после этой подстроки

Из моего примера:
PHP:
$matches[1]="Hello";
$matches[2]="yo";
$matches[3]="yo";
$matches[4]="Buy";
//Если в середине между <!-- BEGIN BLOCK yo --><!-- END BLOCK yo --> нету ещё одного <!-- END BLOCK yo -->
Как запретить выборку <!-- END BLOCK yo -->
 

hermit_refined

Отшельник
как исключить повторение напр. <!-- END BLOCK yo --> в строке $in между <!-- BEGIN BLOCK yo --><!-- END BLOCK yo --><!-- END BLOCK yo -->
просто выбрать первый совпавший <!-- BEGIN BLOCK yo --> , превый совпавший <!-- END BLOCK yo --> и всё что перед, между и после этой подстроки
Как запретить выборку <!-- END BLOCK yo -->
знаете, а у вас из рук вон плохо получается объяснять, что вам надо - противоречиями изъясняетесь.
можете привести более реалистичный пример и сказать, в каком случае какой результат вы хотите получить?

-~{}~ 08.11.06 09:45:

Типа: если такая строка, то такое, если сякая, то сякое, а если такая-сякая, то вот такое-сякое... можете?..
 
hermit_refined
Не мог раньше ответить.
1. Есть строка типа:
Hello<!-- BEGIN BLOCK yo -->Sometext<!-- END BLOCK yo -->Buy

Мне нужно выбрать всю строку, если Sometext не содержит поворения <!-- END BLOCK yo -->, т.е
строка не есть вида
Hello<!-- BEGIN BLOCK yo --><!-- END BLOCK yo --><!-- END BLOCK yo -->Buy

2. Литерал [^abc] напр. исключает сущуествование символов a,b,c в подстороке. Как сделать подобное только для определенного куска ТЕКСТА, типа [^<!-- END BLOCK yo -->]?
 

hermit_refined

Отшельник
1. Регулярные выражение здесь ни к чему:
PHP:
$result = substr_count($str, '<!-- END BLOCK yo -->') == 1 ? $str : false;
2. Подобное можно сделать при помощи regexp.assertions, если, конечно, это действительно вам нужно.
 
hermit_refined
Спасибо

-~{}~ 08.11.06 16:42:

Начал разбираться и вроде понял, но почему не срабатывает:
PHP:
$str="HelloBEGINwENDBuy";
$str=preg_replace("/(.*)BEGIN(?<!q)END(.*)/",'',$str);
echo $str; // Выводит HelloBEGINwENDBuy почему?
 
Подскажите ещё один нюанс, а то читаю-читаю мануал и не могу дойти толку с этой регуляркой.
Моя ОСНОВНАЯ задача реплейсить строку вида <!-- BEGIN BLOCK yo -->Sometext<!-- END BLOCK yo --> если <!-- BEGIN BLOCK yo --> и <!-- END BLOCK yo --> идут подряд, т.е.
Не может быть <!-- BEGIN BLOCK yo --><!-- BEGIN BLOCK yo --><!-- END BLOCK yo -->
и не может быть <!-- BEGIN BLOCK yo --><!-- END BLOCK yo --><!-- END BLOCK yo -->
Какой строкой исключить повторение?
 

sakon

П..и.н..ок
Блин.
Ты уж ТОЧНО определись, ЧТО тебе надо. Твои условия меняются с каждым твоим постом. Тебе уже об этом говорили.
Говори ТОЧНО, что тебе нужно.
Твоя конструкция <!-- BEGIN BLOCK yo --><!-- BEGIN BLOCK yo --><!-- END BLOCK yo -->
чушь полная приводи реальный пример текста или извращайся сам.
 
PHP:
$logged=1;
$in = "
<a href='search.php'>Поиск</a>

<!-- BEGIN INVISIBLE -->
<a href='login.php'>Залогиниться</a>
<!-- END INVISIBLE -->

<a href='faq.php'>F.A.Q</a>

<!-- BEGIN INVISIBLE -->
<a href='registration.php'>Регистрация</a>
<!-- END INVISIBLE -->
";
$in = str_replace("\n",'',$in);
if ($logged)
   {
     $in = preg_replace("~<!-- BEGIN INVISIBLE -->(.*)<!-- END INVISIBLE -->~",'',$in);
   }
echo $in; // Должно вывести <a href='search.php'>Поиск</a><a href='faq.php'>F.A.Q</a>
 
sakon
Вы меня спасли! Надо использовать модификатор U, который уменьшает "жадность" квантификаторов. Спасибо ОГРОМНОЕ!
 
Сверху