Статьи

Заголовок дела в PHP

Функции PHP strtoupper и ucwords пишут с заглавной буквы все символы строки и первую букву каждого слова в строке соответственно. Тем не менее, в стандартной библиотеке PHP нет способа достижения Case Case , который включает использование заглавных букв всех слов, за исключением маленьких слов (таких как соединения), когда они не являются первым словом.

Следующий мини-учебник предоставит решение, похожее на то, которое я придумал, для отображения заголовков тем в выделенных дискуссиях на форумах SitePoint.

Во-первых, нам понадобится список всех слов, которые мы не хотим использовать с заглавной буквы, когда они не являются первым словом. Слова, которые нас должны беспокоить, — это союзы (такие как и или), предлоги (in, on) и внутренние статьи (the, a). Однако я не специалист по грамматике английского языка, поэтому я просто назову их «маленькими словами». Вот выбор из тех, которые я использую.

$smallwordsarray = array( 'of','a','the','and','an','or','nor','but','is','if','then','else','when', 'at','from','by','on','off','for','in','out','over','to','into','with' );

Функция разнесения в PHP может использоваться для разделения любой строки на массив строк, используя символ в качестве символа разделения. Поэтому, если мы разделяем символ пробела (»), мы можем использовать Explode, чтобы разбить нашу строку на слова.

$words = explode(' ', 'this is a title');

$ words становится массивом строк, каждая строка представляет одно слово из исходного $ title. Здесь он будет равен массиву (‘This’, ‘is’, ‘a’, ‘title’).

Теперь мы можем оперировать каждым словом отдельно. Нам нужно проверить каждое слово, чтобы определить, является ли оно одним из наших «маленьких слов». Если это не маленькое слово или первое слово, оно должно быть написано заглавными буквами. Чтобы по очереди работать с каждым членом массива, мы можем использовать языковую конструкцию PHP foreach . Чтобы проверить, является ли слово одним из наших маленьких слов, мы можем использовать in_array

foreach ($words as $key => $word) { if (!$key or !in_array($word, $smallwordsarray)) $words[$key] = ucwords($word); }

Обратите внимание, что я присвоил значение $ words [$ key], а не $ word. Причина этого в том, что $ word было создано оператором foreach. Изменение $ word не приведет к изменению исходного массива $ words. Поэтому мне нужно изменить запись в исходном массиве $ words, которая соответствует текущему ключу массива.

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

$newtitle = implode(' ', $words);

Вот весь сценарий как функция, которую вы можете использовать в своем приложении.

function strtotitle($title) // Converts $title to Title Case, and returns the result. { // Our array of 'small words' which shouldn't be capitalised if // they aren't the first word. Add your own words to taste. $smallwordsarray = array( 'of','a','the','and','an','or','nor','but','is','if','then','else','when', 'at','from','by','on','off','for','in','out','over','to','into','with' );

// Разбиваем строку на отдельные слова
$ words = explode (», $ title);

foreach ($ words как $ key => $ word)
{
// Если это слово первое или это не одно из наших маленьких слов, используйте его заглавными буквами
// с помощью ucwords ().
if ($ key == 0 или! in_array ($ word, $ smallwordsarray))
$ words [$ key] = ucwords ($ word);
}

// Соединяем слова обратно в строку
$ newtitle = implode (», $ words);

вернуть $ newtitle;
}

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

Попробуйте это с названием, например,

echo strtotitle("this is a title");

Результат? «Это заголовок».

Кроме того, быстрый поиск в Google нашел решение той же проблемы в JavaScript . Тем не менее, это кошмар кода — излишне сложный. Он проверяет каждую букву отдельно! Тебе лучше перенести мой скрипт на JavaScript.

Кстати, вот аналогичное решение в ColdFusion .