我正在尋找從另一個字符串的左邊去除字符串$left
$right
。鑑於:PHP字符串交叉點,從右邊的貪婪地帶
$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));
}
}
}
它工作正常。不過,我希望它是「貪婪」,使用盡可能多的$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
產生明顯的結果差異。
什麼是這樣做的目的是什麼? – 2011-07-15 08:31:08
@Pezhvak - 通用字符串操作。在我正在處理的應用程序中有用的幾個實例。 – Dan
它看起來類似於一個差異系統,你可能有興趣在差異執行有https://github.com/paulgb/simplediff/blob/5bfe1d2a8f967c7901ace50f04ac2d9308ed3169/simplediff.php –