我希望从另一个字符串$left
的左侧删除一个字符串$right
。给出:
$left = 'alpha beta gamma';
$right = 'beta gamma delta';
所需的输出是:
string(6) " delta"
现在,我已经完成了这一切。我写了一个函数,以实现这一目标:
function strip_left_from_right($left, $right){
for($i = 0, $m = strlen($left); $i <= $m; $i++){
$needle = substr($left, -$i);
if(substr($right, 0, strlen($needle)) == $needle){
return substr($right, strlen($needle));
}
}
}
它工作正常。但是我希望它是“ greedy ”,尽可能多地使用$left
字符串。例如:
$left = "foofoofoofoo";
$right = "foofoofoobar";
// desired output
string(3) "bar"
// actual output
string(9) "foofoobar"
基本上我的问题是双重的;
1。执行“贪婪”匹配的最佳方式是什么? (给定我继续使用此代码)
可能更重要;
2。是否有更好的(非迭代,串联使用的核心函数集)方法来实现这一目标?
我选择的解决方案,感谢@Yoshi让我的大脑朝着这个方向前进:
function intersect_split($left, $right, $greedy = true){
for($i = 0, $m = strlen($left); $i <= $m; $i++){
$chunk = substr($left, $i * (int) ($greedy ?: -1));
if(substr($right, 0, strlen($chunk)) == $chunk){
return array(
(string) substr($left, 0, $m - strlen($chunk)),
(string) substr($right, strlen($chunk)),
);
}
}
return array($left, $right);
}
$left = 'foo bar bar bar bar';
$right = 'bar bar bar bar baz';
var_dump( intersect_split($left, $right, true) );
var_dump( intersect_split($left, $right, false) );
产地:
array(2) {
[0]=>
string(4) "foo "
[1]=>
string(4) " baz"
}
array(2) {
[0]=>
string(16) "foo bar bar bar "
[1]=>
string(16) " bar bar bar baz"
}
所以现在我基本上将字符串拆分为$left
参数右侧和$right
参数左侧的交叉匹配,从而生成数组中的前导和尾随字符串。 $greedy
会在结果中产生明显的差异。
答案 0 :(得分:2)
不是最佳,但至少它能完成这项工作:
function helper($left, $right) {
$match = '';
for ($i = strlen($left) - 1; $i >= 0; $i -= 1) {
$chunk = substr($left, $i);
$len = strlen($chunk);
if (substr($right, 0, $len) == $chunk && $len > strlen($match)) {
$match = $chunk;
}
}
return substr($right, strlen($match));
}
echo helper('alpha beta gamma', 'beta gamma delta'); // output " delta"
echo helper('foofoofoofoo', 'foofoofoobar'); // output "bar"