Регулярные выражения - нужна помощь

young

Новичок
Регулярные выражения - нужна помощь

Требуется найти подстроку начинающуюся на слово a1, заканчивающуюся на слово a2, и не содержащую внутри слова a3

Что-то типа /a1.+(!a3).+a2/


?!
 

Demiurg

Guest
/a1(([^a].)|(a[^3]))*a2/
хотя я бы сделал спомощью strpos
 

young

Новичок
Автор оригинала: Demiurg
/a1(([^a].)|(a[^3]))*a2/
хотя я бы сделал спомощью strpos
Может вот так
/a1(([^a3].)|([^a3]))*a2/

Хотя я чего-то не понял
a1, a2, a3 - на самом деле абстрактные слова...
нельзя отдельно испрользовать a или 1,2,3
 

young

Новичок
пойми, a1, a2, a3 - условные обозначения. Они могут принимать любые значения!!!
 

Demiurg

Guest
тогда что нибудь типа /a1((?!a3).)*a2/ но это pcre.

повторюсь, я бы сделал через strpos
 

young

Новичок
а как бы ты сделал strpos?! учти, что слова a1, a2, a3 встречаются много раз и могут быит вложены:

a1 a3 a1 a2 a2 a1 a3 a2 a3?
 

Demiurg

Guest
что то на подобии этого :
PHP:
$from = 0;
while()$begin = strpos('a1' , $string ,$from))!==false)
{
 $last = strpos('a2' , $string , $from + strlen('a1'));
 $middle =  strpos('a3' , $string , $from + strlen('a1'));
 if($middle <  $last) 
 {
   $from+=strlen('a1');
   continue;
 }
 echo substr($string , $from , $last - $from);
 $from = $last+strlen('a2');
}
код не рабочий, просто идею показываю.
 
Сверху