Создайте аббревиатуру строки в PHP

Я хочу создать аббревиатуру строки на основе значения строки. Например, если в строке есть пробелы, такие как Форум сообщества Stackoverflow, акроним должен быть SCF, но если в строке нет пробелов, он должен занимать первые 3 буквы слова, например, Stackoverflow должен быть STA. Другая часть должна включать в себя, что если строка состоит всего из 2 символов, она должна добавить случайную буквенно-цифровую букву, например, если строка IT, она должна добавить ее как ITA.

Вот что у меня есть до сих пор. Хотя, если я уберу пробелы, я получу SSTA во втором случае.

Идея заключается в том, что аббревиатура должна состоять всего из 3 символов и должна включать увеличивающиеся числа в предыдущем примере STA001 и следующем аббревиатуре SFC002 и т. д.

$s = 'Stackoverflow Community Forum';

if(preg_match_all('/\b(\w)/',strtoupper($s),$m)) {
    $v = implode('',$m[1]);
    echo $v;
}
if(!preg_match_all('/^\S.*\s.*\S$/',$s))
{
    $v = strtoupper(substr($s,0,3));
    echo $v;
}

Буду признателен за любую помощь. Спасибо


person Dewaldt van Rensburg    schedule 02.09.2020    source источник
comment
Является ли использование preg_match ограничением? Если это не так, есть много более простых способов сделать это.   -  person Hakan SONMEZ    schedule 02.09.2020
comment
Нисколько . Я только что попробовал preg_match из исследования. Но я открыт для любого метода сделать это.   -  person Dewaldt van Rensburg    schedule 02.09.2020
comment
Что бы Stackoverflow Community дал?   -  person Nigel Ren    schedule 02.09.2020


Ответы (1)


Этот код сначала использует одно и то же регулярное выражение для сопоставления первых символов каждого слова, но затем проверяет, что найдено только 1 значение. Если только 1 значение, оно использует первые 3 символа всей строки, в противном случае просто взрывает совпадающие буквы.

Затем он зацикливается до тех пор, пока строка не станет длиной 3 символа, каждый раз добавляя случайный символ (это позволяет использовать строки из 1 символа)...

// Test Values
$s = 'Stackoverflow Community Forum';
$s = 'Stackoverflow Community';
$s = 'Stackoverflow';
$s = 'IT';
$s = 'I';

$s =strtoupper($s);
if(preg_match_all('/\b(\w)/', $s,$m)) {
    if ( count($m[1]) === 1 )   {
        $v = substr($s,0,3);
    }
    else    {
        $v = implode('',$m[1]);
    }
}
else    {
    $v = '';
}
// Pad to 3 chars long.
while ( strlen($v) < 3 )    {
    $v .= chr( ord("A") + rand(0,25) );
}
echo $v;
person Nigel Ren    schedule 02.09.2020
comment
Это работает потрясающе. Большое спасибо @NigelRen. Я должен был реализовать увеличивающееся уникальное значение для каждого из них, как я буду реализовывать это на основе предыдущего значения? Например, SCF001 — первый, а SCF002 — второй? - person Dewaldt van Rensburg; 02.09.2020
comment
Если у вас было что-то вроде $v = 'SCF001';, то $v++ даст вам SCF002. - person Nigel Ren; 02.09.2020
comment
Я понимаю, хотя, когда я указываю это как $n = "001"; for($n=0;$n<6;$n++) echo $v + $number++;, он игнорирует 00 и просто считает 1 2 3 и т. д. - person Dewaldt van Rensburg; 02.09.2020
comment
Вам нужно будет добавить 001 в строку перед выполнением приращения. - person Nigel Ren; 02.09.2020
comment
Я тоже это сделал, он видит 001 как часть строки и полностью меняет аббревиатуру и по-прежнему игнорирует 00 - person Dewaldt van Rensburg; 02.09.2020
comment
Вы имеете в виду, что сделали $v = $v + "001";, а затем $v++, и это дало вам что-то еще? - person Nigel Ren; 02.09.2020
comment
Извините, @NigelRen, я понял. $cl_cd = $v; $cl_cd .= "000"; $cl_cd++; echo $cl_cd; - person Dewaldt van Rensburg; 02.09.2020