2013-04-01 6 views
4

Мне нужно найти все строки, расположенные между START и END, за исключением подстроки PADDING из сопоставленной строки. Лучший способ я нашелШаблон совпадения и исключить подстроки с preg_match_all

$r="stuffSTARTthisPADDINGisENDstuffstuffSTARTwhatPADDINGIwantPADDINGtoPADDINGfindENDstuff" ; 
preg_match_all('/START(.*?)END/',str_replace('PADDING','',$r),$m); 
print(join($m[1])); 
> thisiswhatIwanttofind 

Я хочу сделать это с наименьшим размером кода возможных: там короче только с preg_match_all и не str_replace, что в конечном итоге возвращается непосредственно строка без присоединиться массивы? Я пробовал с некоторыми выражениями, но я не могу найти правильный.

+0

Является 'PADDING 'буквальный текст, который будет находиться между« START »и« END »? В противном случае, какие персонажи будут «PADDING»? –

+0

PADDING - фиксированная строка ascii – Emilio

ответ

1
$r="stuffSTARTthisPADDINGisENDstuffstuffSTARTwhatPADDINGIwantPADDINGtoPADDINGfindENDstuff"; 
echo preg_replace('/(END.*?START|PADDING|^[^S]*START|END.*$)/', '', $r); 

Это должно вернуть вам thisiswhatIwanttofind с помощью одного шаблона регулярного выражения

Объяснение: -

END.*?START # Replace occurrences of END to START 
PADDING  # Replace PADDING 
^[^S]*START # Replace any character until the first START (inclusive) 
END.*$  # Replace the last END and until end of the string 
0
$r="stuffSTARTthisPADDINGisENDstuffstuffSTARTwhatPADDINGIwantPADDINGtoPADDINGfindENDstuff" ; 
preg_match_all('/(?:START)(.*?)(?:END)/',str_replace('PADDING','',$r),$m); 
var_dump(implode(' ',$m[1])); 

будет работать, но я думаю, вы хотите что-то быстрее.

0

Вы также можете использовать использовать preg_replace_callback как это:

$str = preg_replace_callback('#.*?START(.*?)END((?!.*?START.*?END).*$)?#', 
      function ($m) { 
       print_r($m); 
       return str_replace('PADDING', '', $m[1]); 
      }, $r); 

echo $str . "\n"; // prints thisiswhatIwanttofind