如何从字符串中检索重复的子串?

时间:2015-05-04 10:18:43

标签: php

如何在符号字符串“ - ”中爆炸甚至单词?对于前:

$string = 'tshirt-blue-124-tshirt-blue-124-tshirt-blue-124';

$string = '333-red-333-red-333-red-333-red';

我需要这样的数组:

$string[0] = 'tshirt-blue-124';
$string[1] = 'tshirt-blue-124';
$string[2] = 'tshirt-blue-124';

 $string[0] = '333-red';
 $string[1] = '333-red';
 $string[2] = '333-red';
 $string[3] = '333-red';

感谢

5 个答案:

答案 0 :(得分:3)

如果它总是每三个元素:

$string = 'tshirt-blue-124-tshirt-blue-124-tshirt-blue-124';

$newArray = array_chunk(explode('-', $string), 3);
array_walk(
    $newArray, 
    function(&$value) {
        $value = implode('-', $value);
});
var_dump($newArray);

修改

但你必须提前知道有多少元素:

$splitValue = 2;
$string = '333-red-333-red-333-red-333-red';

$newArray = array_chunk(explode('-', $string), $splitValue);
array_walk(
    $newArray, 
    function(&$value) {
        $value = implode('-', $value);
});
var_dump($newArray);

编辑#2

如果您不知道重复块中有多少元素,请查看Lempel-Ziv-Welsh (LZW) compression algorithm。它建立在检测字符串中的重复并利用它们进行压缩的基础上。您可以使用Suffix Trie数据结构来简化逻辑。

编辑#3

作为尝试识别分割大小的简单方法:

function getSplitSize($string) {
    $splitSize = 2;
    do {
        $tempArray = array_chunk(explode('-', $string), $splitSize);
        if ($tempArray[0] == $tempArray[1])
            return $splitSize;
        ++$splitSize;
    } while ($splitSize <= count($tempArray));
    throw new Exception('No repetition found');
}

function splitStringOnRepetition($string) {
    $newArray = array_chunk(explode('-', $string), getSplitSize($string));
    array_walk(
        $newArray, 
        function(&$value) {
            $value = implode('-', $value);
        }
    );
    return $newArray;
}


$string = 'tshirt-blue-124-tshirt-blue-124-tshirt-blue-124';
$array = splitStringOnRepetition($string);
var_dump($array);

$string = '333-red-333-red-333-red-333-red';
$array = splitStringOnRepetition($string);
var_dump($array);

答案 1 :(得分:1)

对于高级但高效的方法,您可以使用preg_match()

使用正则表达式匹配
$string = 'tshirt-blue-124-tshirt-blue-125-tshirt-blue-126';
$pattern = "/([A-Za-z]*-[A-Za-z]*-[\d]*)-?/";
preg_match_all($pattern, $string, $matches);

echo "<pre>";
print_r($matches[1]);
echo "</pre>";

它将输出:

Array
(
    [0] => tshirt-blue-124
    [1] => tshirt-blue-125
    [2] => tshirt-blue-126
)

你可以按照你想要的方式设置模式..

答案 2 :(得分:0)

你可以做这样的事情

$string = 'tshirt-blue-124-tshirt-blue-124-tshirt-blue-124';
$tmp = explode("-", $string);
while ($tmp) {
               $output[] = implode('-', array_splice($tmp, 0, 3));
              }
print_r($output);

答案 3 :(得分:0)

尝试 -

$string = 'tshirt-blue-124-tshirt-blue-124-tshirt-blue-124';

$new = explode('-', $string);
$i = 0;
$result = array();
while ($i < count($new)) {
   $result[] = $new[$i].'-'.$new[$i+1].'-'.$new[$i+2];
   $i += 3;
}
var_dump($result);

答案 4 :(得分:0)

爆炸

$string = explode("tshirt-", $string);

现在您必须将值添加到每个Array元素

foreach($string as &$v){
    $v = "tshirt-" . $v;
    $v = rtrim($v, "-");
}

这是一个非常简单易懂的解决方案。