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