4

我需要找到放置在 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 的更短,最终直接返回没有连接数组的字符串?我尝试了一些环视表达式,但找不到合适的表达式。

4

3 回答 3

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
于 2013-04-02T06:57:46.710 回答
0
$r="stuffSTARTthisPADDINGisENDstuffstuffSTARTwhatPADDINGIwantPADDINGtoPADDINGfindENDstuff" ;
preg_match_all('/(?:START)(.*?)(?:END)/',str_replace('PADDING','',$r),$m);
var_dump(implode(' ',$m[1]));

会工作,但我想你想要更快的东西。

于 2013-04-01T21:04:46.207 回答
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
于 2013-04-01T21:47:29.573 回答