2011-07-15 21 views
2

我正在尋找從另一個字符串的左邊去除字符串$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產生明顯的結果差異。

+0

什麼是這樣做的目的是什麼? – 2011-07-15 08:31:08

+0

@Pezhvak - 通用字符串操作。在我正在處理的應用程序中有用的幾個實例。 – Dan

+1

它看起來類似於一個差異系統,你可能有興趣在差異執行有https://github.com/paulgb/simplediff/blob/5bfe1d2a8f967c7901ace50f04ac2d9308ed3169/simplediff.php –

回答

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" 
+0

謝謝@Yoshi - 你的回答讓我思考在方向我確實需要;看到問題的解決方案,我會標記你接受,因爲它讓我在那裏:) – Dan