PHP字符串交叉,从右边贪婪地剥离

时间:2011-07-15 08:23:34

标签: php string substring intersection

我希望从另一个字符串$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会在结果中产生明显的差异。

1 个答案:

答案 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"