Как преобразовать строку в маленькие заглавные буквы в PHP?

Я пытаюсь преобразовать строчку, состоящую из "стандартных" прописных и строчных букв в маленькие буквы в PHP. В документации php.net нет информации о маленьких заглавных буквах.

Маленькие столицы, в моем понимании, это:

ᴇʟʟᴏ ᴛʜᴇʀᴇ

(создается с помощью этого сайта: https://fsymbols.com/generators/smallcaps/)

Например, вот маленькая версия t: http://www.fileformat.info/info/unicode/char/1d1b/index.htm

Я долго искал в Интернете и ничего не нашел в PHP. Я знаю, что CSS позволит вам сделать это с помощью

font-variant: small-caps;

Но мне нужно сделать это на стороне сервера для того, что я делаю. Это возможно в PHP?

РЕДАКТИРОВАТЬ: Чтобы завершить свой вопрос, я пытаюсь создать простой текст. Так что в моем случае нет HTML, изображений или CSS.

РЕДАКТИРОВАТЬ 2: На веб-сайте, связанном, функция Javascript используется для преобразования текста

Вот код:

function encool() {
    var _0xce74x20 = location[_0x804c[82]],
        _0xce74x21;
    if (_0xce74x20[_0x804c[84]](_0x804c[83]) == -1 && _0xce74x20[_0x804c[84]](_0x804c[85]) == -1 && _0xce74x20[_0x804c[84]](_0x804c[86]) == -1 && _0xce74x20[_0x804c[84]](_0x804c[87]) == -1 && _0xce74x20[_0x804c[84]](_0x804c[88]) == -1) {
        _0xce74x21 = document[_0x804c[91]][_0x804c[90]][_0x804c[89]]
    } else {
        _0xce74x21 = change(decomposeAString(document[_0x804c[91]][_0x804c[90]][_0x804c[89]]))
    };
    document[_0x804c[91]][_0x804c[92]][_0x804c[89]] = _0xce74x21
}

Уверен, он использует отображение персонажей. Я посмотрю на это и выложу решение, если найду его.

4 ответа

Решение

Хорошо, вот решение, которое я придумал, но оно не очень полное, потому что даже если оно соответствует моим потребностям. Мне нужно это, чтобы преобразовать небольшой текст (названия категорий), так что это нормально для меня.

function convertToSmallCaps($string) {
    // standar capitals
    $caps = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
    // small capitals
    $smallCaps = array('ᴀ', 'ʙ', 'ᴄ', 'ᴅ', 'ᴇ', 'ꜰ', 'ɢ', 'ʜ', 'ɪ', 'ᴊ', 'ᴋ', 'ʟ', 'ᴍ', 'ɴ', 'ᴏ', 'ᴘ', 'ǫ', 'ʀ', 's', 'ᴛ', 'ᴜ', 'ᴠ', 'ᴡ', 'x', 'ʏ', 'ᴢ');

    // remove all chars except [a-z] and - (replacing dashes with spaces)
    $sanitized_string = str_replace('-',' ',sanitize_title($string));

    // convert to uppercase
    $sanitized_string = mb_strtoupper($string);

    $length = strlen($sanitized_string);
    $output_string='';
    for($i = 0; $i<$length; $i++){
        $char = $sanitized_string[$i];
        // If the letter exsist in small capitals
        $letter_position = array_search($char,$caps);
        if(is_numeric($letter_position) && isset($smallCaps[$letter_position])) {
            // We append it to the ouput string
            $output_string.=$smallCaps[$letter_position];

        } else {
            // or else we append the original char to the output string
            $output_string.=$char;
        }
    }
    // return the converted string
    return $output_string;
}

Это в основном отображает все символы в строке от заглавных букв до маленьких заглавных букв

Проблемы:

  1. это зависит от WordPress. Я использовал sanitize_title функция из WordPress, которая "слагает" строку (удаляя все символы кроме [a-z] а также -)
  2. Если в вашем тексте много диакритических знаков или он состоит из цифр и нелатинских символов или длиннее имени категории, результат может быть немного странным
  3. некоторые буквы (x или s или q) не являются маленькими заглавными буквами (потому что их нет, я полагаю?), поэтому на некоторых экранах результат может быть запутанным.

Я постараюсь улучшить это в будущем, если мои потребности изменятся

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

Для этого вам нужна таблица сопоставления, которая отображает каждый символ в кулон с маленькими прописными в UNICODE. использование mb_convert_encoding() для конвертации в PHP.

Посмотрите этот пример из документации PHP о том, как использовать пользовательскую таблицу сопоставления.

Сопоставьте каждый символ, а затем переберите свою строку.

<?php
//Initialize the map
$map = array(
    "A"=>"ᴀ",
    "B"=>"ʙ",
    "C"=>"ᴄ",
    "D"=>"ᴅ"
    //etc
    );

function convertToSmall($string,$map){   
    //Our string to return
    $return = "";
    //You can replace length + the for loop for an explode + foreach
    $length = strlen($string);
    for($i = 0; $i<$length; $i++){
        //set our input character
        $input = strtoupper($string[$i]);
        //check if its in the map
        if(isset($map[$input])){
            $input = $map[$input];
        } 
        //write to our output
        $return .= $input;

    }

    return $return;

}

print_r(convertToSmall("aa bc da",$map));    

Выход этого:
ᴀᴀ ʙᴄ ᴅᴀ

3v4l ссылка

Вот мой простой подход:

      function small_caps($string)
{
   $buf = "";

   for ($i = 0; $i < strlen($string); $i++)
   {
      $char = substr($string, $i, 1);

      if (ctype_lower($char))
         $buf .= "<small>$char</small>";
      else
         $buf .= $char;
   }

   // remove redundancies
   $buf = str_replace("</small><small>","",$buf);

   return "<span style='text-transform:uppercase'>$buf</span>";
}
Другие вопросы по тегам