Как преобразовать эту функцию обработки строк в UTF-8, совместимую с PHP? - PullRequest
3 голосов
/ 12 октября 2010

У меня были проблемы с поиском функции, которая делает именно то, что я ищу.К сожалению, эта функция не совместима с UTF-8.Эта функция похожа на базовую ucwords, но она также выполняет верхний регистр символа, за которым следует один из найденных символов (в моем случае мне нужно применить верхний регистр к символу, найденному после -).

Вот функция:

<?php
function my_ucwords($string)
  {
    $noletters='"([/-'; //add more if u need to
    for($i=0; $i<strlen($noletters); $i++)
      $string = str_replace($noletters[$i], $noletters[$i].' ', $string);
    $string=ucwords($string);
    for($i=0; $i<strlen($noletters); $i++)
      $string = str_replace($noletters[$i].' ', $noletters[$i], $string);
    return $string;
  }

$title = 'ELVIS "THE KING" PRESLEY - (LET ME BE YOUR) TEDDY BEAR';
echo my_ucwords(strtolower($title));
?>

Как только я добавлю акценты в мою строку, например:

echo my_ucwords(strtolower( "saint-étienne" )) //return: Saint- instead of Saint-Étienne

Есть идеи?Я знаю вместо strlen я мог бы использовать mb_strlen.Но как насчет других?

Редактировать: Просто напоминание, что мне нужен не только простой ucwords, работающий в UTF-8.Мне нужно, чтобы он применял заглавные буквы к любому символу, найденному после -.

Я все еще пытаюсь выяснить это сам.

Ответы [ 4 ]

6 голосов
/ 12 октября 2010

Ваша проблема в том, чтобы учиться. Быстрый поиск на странице php заставил меня обнаружить это:

function mb_ucwords($str) {
    return mb_convert_case($str, MB_CASE_TITLE, "UTF-8");
}

Я тестировал, и он отлично работает, просто запомните эту строку:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
0 голосов
/ 12 октября 2010

Ну, вам нужно поменять несколько функций. Во-первых, альтернативы str_replace для UTF-8 нет (она может вам понадобиться, а может и не понадобиться). Вам следует заменить ucwords на mb_convert_case и strlen на mb_strlen ...

Но есть более эффективные способы сделать это, чем несколько раз:

function my_ucwords($string) {
    $chrs = '"([/-';
    $searchRegex = '/('.preg_quote($chrs, '/').')/u';
    $replaceRegex = '/('.preg_quote($chrs, '/').')\s/u';
    $tmpString = preg_replace($searchRegex, '\1 ', $string);
    $tmpString = mb_convert_case($tmpString, MB_CASE_TITLE);
    return preg_replace($replaceRegex, '\1', $tmpString);
}
0 голосов
/ 12 октября 2010
0 голосов
/ 12 октября 2010

Я думаю, это то, что вам нужно: http://www.php.net/manual/en/function.mb-convert-case.php

...