匹配模式并使用preg_match_all排除子字符串

时间:2013-04-01 11:47:25

标签: php regex preg-match-all regex-lookarounds

我需要找到START和END之间的所有字符串,包括来自匹配字符串的PADDING子字符串。我找到的最好方法是

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

我想用尽可能最小的代码大小来做这个:只有preg_match_all和没有str_replace的更短,最终直接返回没有连接数组的字符串?我尝试了一些环视表达式,但我找不到合适的表达式。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

$r="stuffSTARTthisPADDINGisENDstuffstuffSTARTwhatPADDINGIwantPADDINGtoPADDINGfindENDstuff" ;
preg_match_all('/(?:START)(.*?)(?:END)/',str_replace('PADDING','',$r),$m);
var_dump(implode(' ',$m[1]));

可行,但我想你想要更快的东西。

答案 2 :(得分: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