2010-05-31 3 views
2

Y at-il une fonction intégrée en PHP qui combinerait 2 chaînes en 1?fonction intégrée pour combiner des séquences de chaînes qui se chevauchent en PHP?

Exemple:

$string1 = 'abcde'; 
$string2 = 'cdefg'; 

se combinent pour obtenir: abcdefg.

Si la séquence exacte de chevauchement et la position sont connues, il est possible d'écrire un code pour les fusionner.

TIA

+0

C'est un problème à trouver le plus grand commun sous-chaîne: http://stackoverflow.com/questions/336605/how-can-i-find-the-largest-common-substring-between-two-strings-in-php – diyism

Répondre

-1

Il est possible en utilisant substr_replace() et strcspn():

$string1 = 'abcde'; 
$string2 = 'cdefgh'; 

echo substr_replace($string1, $string2, strcspn($string1, $string2)); // abcdefgh 
+0

Merci, je vais essayer, ça devrait raccourcir mes codes. – Jamex

+1

echo substr_replace ('aacdabc', 'dabcg', strcspn ('aacdabc', 'dabcg')); // dabcg – diyism

-1

Non, il n'y a pas de fonction builtin, mais vous pouvez facilement écrire vous-même en utilisant substr et une boucle pour voir à quel point des chaînes qui se chevauchent.

+0

Merci, je suis à la recherche pour un raccourci pour réduire le code. Mais je suppose que ce n'est pas possible. – Jamex

4

Je trouve la méthode substr_replace pour retourner des résultats amusants. Surtout lorsque vous travaillez avec des cordes url. Je viens d'écrire cette fonction. Il semble fonctionner parfaitement pour mes besoins. La fonction retournera la correspondance la plus longue possible par défaut.

function findOverlap($str1, $str2){ 
    $return = array(); 
    $sl1 = strlen($str1); 
    $sl2 = strlen($str2); 
    $max = $sl1>$sl2?$sl2:$sl1; 
    $i=1; 
    while($i<=$max){ 
    $s1 = substr($str1, -$i); 
    $s2 = substr($str2, 0, $i); 
    if($s1 == $s2){ 
     $return[] = $s1; 
    } 
    $i++; 
    } 
    if(!empty($return)){ 
    return $return; 
    } 
    return false; 
} 

function replaceOverlap($str1, $str2, $length = "long"){ 
    if($overlap = findOverlap($str1, $str2)){ 
    switch($length){ 
     case "short": 
     $overlap = $overlap[0]; 
     break; 
     case "long": 
     default: 
     $overlap = $overlap[count($overlap)-1]; 
     break; 
    }  
    $str1 = substr($str1, 0, -strlen($overlap)); 
    $str2 = substr($str2, strlen($overlap)); 
    return $str1.$overlap.$str2; 
    } 
    return false; 
} 

Utilisation pour obtenir le match de longueur maximale:

echo replaceOverlap("abxcdex", "xcdexfg"); //Result: abxcdexfg 

Pour obtenir le premier match au lieu du dernier match appeler la fonction comme ceci:

echo replaceOverlap("abxcdex", "xcdexfg", “short”); //Result: abxcdexcdexfg 

Pour obtenir la chaîne de chevauchement il suffit d'appeler:

echo findOverlap("abxcdex", "xcdexfg"); //Result: array(0 => "x", 1 => "xcdex") 
+0

+1 Je change '$ s1 = substr ($ str1 de, sl1- $ $ i);' pour: '$ s1 = substr ($ str1 de - $ i);' - il serait plus élégant;) en second lieu, vous voudrez peut-être envisager de vérifier également le chevauchement dans la direction opposée: 'findOverlap (de str2 $, str1 de $)' – alfasin

+0

Merci, je mis à jour la fonction et retiré SL1 $ de substr. –

Questions connexes