【问题标题】:built in function to combine overlapping string sequences in php?内置函数来组合 php 中的重叠字符串序列?
【发布时间】:2011-02-26 02:09:42
【问题描述】:

PHP 中是否有内置函数可以将 2 个字符串合并为 1 个字符串?

示例

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

组合得到:abcdefg

如果确切的重叠顺序和位置已知,则可以编写代码将它们合并。

TIA

【问题讨论】:

标签: php string merge overlapping


【解决方案1】:

不,没有内置函数,但您可以通过使用substr 和一个循环轻松地自己编写一个函数来查看有多少字符串重叠。

【讨论】:

  • 谢谢,我只是在寻找减少代码的捷径。但我想这是不可能的。
【解决方案2】:

可以使用substr_replace()strcspn()

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

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

【讨论】:

  • 谢谢,我会试一试,它应该有助于缩短我的代码。
  • echo substr_replace('aacdabc', 'dabcg', strcspn('aacdabc', 'dabcg')); //dabcg
【解决方案3】:

我发现 substr_replace 方法可以返回有趣的结果。 特别是在使用 url 字符串时。我刚刚写了这个函数。 它似乎非常适合我的需求。 默认情况下,该函数将返回可能的最长匹配项。

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;
}

获取最大长度匹配的用法:

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

要获取第一个匹配项而不是最后一个匹配项,请调用如下函数:

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

要获取重叠字符串,只需调用:

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

【讨论】:

  • +1 我会将$s1 = substr($str1, $sl1-$i); 更改为:$s1 = substr($str1, -$i); - 这会更优雅;)其次,您可能还需要考虑检查相反方向的重叠:findOverlap($str2, $str1);
  • 正在寻找类似的东西。很好的解决方案!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多