比较并删除2个字符串中的差异

时间:2014-10-11 20:10:21

标签: php

我有两个字符串:

$stringOne = 'ABCDEF123-20140705-546.xml';
$stringTwo = 'ABCDEF123-20140705-589.xml';

我需要创建一个如下所示的新字符串:$result = 'ABCDEF123-20140705.xml'

结果与两个输入字符串之间的差异在于删除了末尾的连字符和3位数字。我认为这应该是可能的,因为输入字符串与XML扩展之前的最后3位数字完全相同。

我以这种方式格式化问题的原因是因为有数百个这样的字符串我需要用相同的格式进行比较,它不像删除-546和{{一样简单1}}来自字符串,因为这些是变量(就像字符串前缀一样)。

有什么想法吗?

另外两个示例字符串可能是:

-589
$stringOne = 'XJ1ERJJFK-20140305-128.xml';

我希望结果为:$stringTwo = 'XJ1ERJJFK-20140305-584.xml';

3 个答案:

答案 0 :(得分:2)

这样的东西?

使用explode()

function cut($string)
{
    // divide filename in basename and extension (simple solution)  
    $filenameParts = explode('.', $string);
    $filename = $filenameParts[0];
    $extension = $filenameParts[1];

    $parts = explode('-', $filename); // split to an array
    unset($parts[2]); // remove the parts from array
    return implode('-', $parts) .'.' .$extension; // combine new filename
}

使用preg_replace()(1)

或者使用正则表达式更短。此正则表达式期望字符串中的所有描述的组件。带有alpha的第一个块以及带有日期的第二个块。

function cut($string) {
    return preg_replace('/^([A-Z0-9]{9}\-[0-9]{8})(?:\-[0-9]{3})(\.xml)$/i', '$1$2', $string);
}

Regular expression visualization

Debuggex Demo

使用preg_replace()(2)

更新:其他解决方案可能只是替换字符-NNN.,其中N是一个数字,如下所示:

function cut($string) {
    return preg_replace('/\-[0-9]{3}\./i', '.', $string);
}

Regular expression visualization

Debuggex Demo

然后根据需要随时调用该函数:

$stringOne = 'XJ1ERJJFK-20140305-128.xml';
$stringTwo = 'XJ1ERJJFK-20140305-584.xml';

$stringOneNew = cut($stringOne); // returns "XJ1ERJJFK-20140305.xml"

对于数组中的多个字符串,请执行以下操作:

$new_array = array();
foreach ($your_array as $filename) {
    $new_array[$filename] = cut($filename);
}

结果$new_array如下所示:

$new_array = array(
    // 'key' => 'value'
    // 'original' => 'generated with cut func'
    'ABCDEF123-20140705-546.xml' => 'ABCDEF123-20140705.xml',
    'ABCDEF123-20140705-589.xml' => 'ABCDEF123-20140705.xml',
    'XJ1ERJJFK-20140305-128.xml' => 'XJ1ERJJFK-20140305.xml',
    // ...
);

现在你有一个映射,你的比较字符串作为数组值,原始作为键,如果需要以后的东西。然后你可以用它做许多技巧,例如:

$unique_array_keys = array_keys($filenames); // array('ABCDEF123-20140705-546.xml', 'ABCDEF123-20140705-589.xml', 'XJ1ERJJFK-20140305-128.xml')
$unique_array_values = array_unique(array_values($filenames)); // array('ABCDEF123-20140705.xml', 'XJ1ERJJFK-20140305.xml')

// and more...

答案 1 :(得分:1)

  

删除2个字符串中的差异

以下是如何操作的示例。这将比较字符串中的每个字符并省略差异,以及文件名中的任何尾部破折号。您可能需要对其进行更多调整以适应边缘情况:

$str1 = 'XJ1ERJJFK-20140305-128.xml';
$str2 = 'XJ1ERJJFK-20140305-584.xml';

$pi1 = pathinfo($str1);
$pi2 = pathinfo($str2);

if ($pi1['extension'] === $pi2['extension']) {
    $newExt = '.' . $pi1['extension'];
} else {
    $newExt = '';
}

$piLen1 = strlen($pi1['filename']);

$newStr = '';
for ($i = 0; $i < $piLen1; $i++) {
    if ($pi1['filename'][$i] == $pi2['filename'][$i]) {
        $newStr .= $pi1['filename'][$i];
    }
}

$newStr = rtrim($newStr, '-') . $newExt;

echo $newStr; // XJ1ERJJFK-20140305.xml

答案 2 :(得分:0)

如果您确定字符串的格式正确,请使用:

function cutXmlFilePath($string) {
    return substr($string, 0, strrpos($string, '-')) . '.xml';
}

样本用法:

$strings = array(
    'ABCDEF123-20140705-546.xml',
    'ABCDEF123-20140705-589.xml');
$result = array_map('cutXmlFilePath', $strings);
var_dump($result);

输出:

array (size=2)
  0 => string 'ABCDEF123-20140705.xml' (length=22)
  1 => string 'ABCDEF123-20140705.xml' (length=22)