php preg_replace ucwords для испанских sh имен со специальными символами - PullRequest
0 голосов
/ 26 мая 2020

Мне нужно получить тот же результат функции ucwords для имен на испанском языке sh с акцентами и 'ñ', например « Ángela María usté Fernández » или « José Édgar Ramírez Álvarez"

После большого количества сделок я получаю следующий алгоритм:

/*------------------------------------------------------------------*/
function html2ucwords($texto)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DESCRIPCION:
Pone la primera letra de cada palabra en mayúscula teniendo en cuenta
las tildes.
--------------------------------------------------------------------*/
{
    $retorno = htmlentities($texto);
    $retorno = strtolower($retorno);
    $retorno = ucwords($retorno);

    $retorno = preg_split("# #", $retorno);
    $tilinc = array( '#^á#'
                   , '#^é#'
                   , '#^í#'
                   , '#^ó#'
                   , '#^ú#'
                   , '#^ñ#'
                   );
    $mayusculas = array( 'Á'
                       , 'É'
                       , 'Í'
                       , 'Ó'
                       , 'Ú'
                       , 'Ñ'
                       );
    foreach ($retorno as $llave => $valor)
        $retorno[$llave] = preg_replace($tilinc, $mayusculas, $valor);

    $retorno = join(" ", $retorno);
    $retorno = html_entity_decode($retorno);

    return $retorno;
}

Мне интересно, есть ли лучший способ решить это требование.

1 Ответ

1 голос
/ 26 мая 2020

Да, безусловно: избегайте сущностей и относитесь к Unicode как есть - таким образом он также работает для символов / букв, которые вы забыли. Не говоря уже о других языках и системах букв.

Согласно https://www.php.net/manual/en/function.mb-strtoupper.php#124253 вы можете легко комбинировать mb_strlen(), mb_substr() и mb_strtoupper() для создания своей собственной функции:

// First character in uppercase, others in lowercase
function mb_ucfirst( $sInput, $sEncoding= 'UTF-8' ) {
  $iLen=   mb_strlen    ( $sInput,              $sEncoding );
  $sFirst= mb_substr    ( $sInput, 0,        1, $sEncoding );
  $sRest=  mb_substr    ( $sInput, 1, $iLen- 1, $sEncoding );
  return   mb_strtoupper( $sFirst,              $sEncoding ). mb_strtolower( $sRest );
}

// Perform ucfirst() on every word 
function mb_ucwords( $sInput, $sEncoding= 'UTF-8' ) {
  $aWord= preg_split( '/ /u', $sInput );
  $sOut= '';
  foreach( $aWord as $iWord=> $sWord ) $aWord[$iWord]= mb_ucfirst( $sWord, $sEncoding );
  return join( ' ', $aWord );
}

// Now test it
header( 'Content-type: text/plain' );
$aTest= array
( 'áNgELa MARÌA ñUESé Álvarez áLVAREZ'  // i.e. Spanish
, 'änGY ösTRogEN'                       // i.e. German
, 'Мария шараПОВА'                      // Cyrillic
, 'βήτα θήΤΑ'                           // Greek
, 'CHLOË'                               // i.e. Afrikaans
, 'łaTYnKA'                             // i.e. Polish
, 
);
$i= 0;
foreach( $aTest as $sTest ) printf( "%d. %s \t >>> \t %s\n", ++$i, $sTest, mb_ucwords( $sTest ) );

Конечно: сохраните весь PHP файл в UTF-8 и аналогичным образом обработайте свой ввод. Если вы используете другую кодировку, вы должны указать это в качестве второго параметра функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...