根据数组中的一个前缀将字符串分为两部分

时间:2014-12-04 17:34:24

标签: php

所以我拥有在db中作为字符串保存的医疗许可证。  我需要一种方法来单独显示许可证字母(前缀)和号码。

前缀数组是预先定义的:

$license_letters = array('20A', 'A', 'C', 'CNM', 'G', 'NP', 'PA');

许可证看起来像20A345000,C11006,G678999,PA200200等。 所以我需要能够获得'20A'和'345000'或'C'和'11006'作为任何许可。

按第一个数字搜索将无效,因为其中一个可能的前缀是20A。 我很确定必须有一个简单的解决方案,但我无法想到它。 会有任何帮助。

2 个答案:

答案 0 :(得分:2)

如果没有许可证字符串是其中任何一个的一部分(列表中没有“A”和“AB”),那么只需循环查找第一个匹配项,如下所示:

function parts($licenseString) {
    $foreach($license_letters AS $prefix) {
        if(strpos($licenseString, $prefix) === 0) {
            return [$prefix, substr($licenseString, strlen($prefix)];
        }
    }
}

编辑:我打算在比较中使用===。当没有找到匹配时,strpos返回'false',我们想要在零位置匹配,因此我们正在寻找一个特别是0(类型号)的返回值。感谢评论者指出这一点。

答案 1 :(得分:0)

您可能希望按照其中的字符串值的长度对前缀数组进行排序,以避免具有多字符前缀的情况(例如“20A”)与单字符前缀混淆(例如“A”) ):

/**
 * Compare two string values
 *
 * @param $value1 string 1st value to compare
 * @param $value2 string 2nd value to compare
 *
 * @return bool true if the second string is longer than the first
 */
function compareStringLength($value1, $value2)
{
    return (strlen($value1) < strlen($value2));
}

/**
 * Parse a license string
 *
 * @param     $license         string
 * @param     $licensePrefixes array of license prefixes
 *
 * @return array [prefix,license without prefix]
 */
function parseLicense($license, $licensePrefixes)
{
    //The limit to number of times the license prefix will be replaced
    $limit = 1;
    foreach ($licensePrefixes AS $prefix) {
        if (strpos($license, $prefix) !== false) {
            $license = str_replace($prefix, "", $license, $limit);

            return array($prefix, $license);
        }
    }
}

$licensePrefixesArray = array('20A', 'A', 'C', 'CNM', 'G', 'NP', 'PA');

/*
Sort the array to prevent confusion with multi-character prefixes (for example '20A')
and single character prefixes (for example 'A')
*/
usort($licensePrefixesArray, "compareStringLength");

print_r(parseLicense("20A345000", $licensePrefixesArray));
print_r(parseLicense("PA200200", $licensePrefixesArray));
print_r(parseLicense("A2533226", $licensePrefixesArray));