CAPS в названиях - это плохо

Кричать заглавными буквами - не хорошо. Но зачастую, менеджеры норовят добавить в названия большей заметности (на их взгляд) и лепят слова заглавными буквами. Google Покупки (Google Merchant Center) это чётко запрещает в своих фидах (https://support.google.com/merchants/answer/188494): "мы запрещаем добавлять в название рекламный текст (такой как "Бесплатная доставка") или использовать ЗАГЛАВНЫЕ БУКВЫ".
Вот пример, как в PHP проверить строку на наличие ЗАГЛАВНЫХ БУКВ:

<?
$arStrings = [
    'CAPS is bad',
    'No caps at whole World Wide Web!',
    'caps is bad!',
    'No caps - No problems!',
    'But with CAPS THERE ARE a LOT of problems!'
];

$pattern = '/(\p{Lu}){2,}/';
foreach ($arStrings as $string) {
    if (preg_match($pattern, $string)) {
        echo 'String "' . $string . '" with CAPS!' . '<br>';
    } else {
        echo 'String "' . $string . '" without CAPS!' . '<br>';
    }
}
Скрипт сформирует такой вывод:

String "CAPS is bad" with CAPS!
String "No caps at whole World Wide Web!" without CAPS!
String "caps is bad!" without CAPS!
String "No caps - No problems!" without CAPS!
String "But with CAPS THERE ARE a LOT of problems!" with CAPS! 
Т.е. паттерн "/(\p{Lu}){2,}/" позволяет найти две и более подряд идущие заглавные буквы, но только для латиницы.
Для кириллицы, нужно добавить модификатор юникода, чтобы получилось так: "/(\p{Lu}){2,}/u". Проверяем:

<?
$arStrings = [
    'CAPS is bad',
    'No caps at whole World Wide Web!',
    'caps is bad!',
    'No caps - No problems!',
    'But with CAPS THERE ARE a LOT of problems!',
    'Такой КАПС тоже не пройдёт!',
    'Бывают же адекватные заголовки',
    '1.1 Первый; 1.2. Второй; 1.3. Третий',
    '2.1. ПЕРВЫЙ; 2.2. ВТОРОЙ; 2.3. ТРЕТИЙ'
];

$pattern = '/(\p{Lu}){2,}/u';
foreach ($arStrings as $string) {
    if (preg_match($pattern, $string)) {
        echo 'String "' . $string . '" with CAPS!' . '<br>';
    } else {
        echo 'String "' . $string . '" without CAPS!' . '<br>';
    }
}
Вывод:

String "CAPS is bad" with CAPS!
String "No caps at whole World Wide Web!" without CAPS!
String "caps is bad!" without CAPS!
String "No caps - No problems!" without CAPS!
String "But with CAPS THERE ARE a LOT of problems!" with CAPS!
String "Такой КАПС тоже не пройдёт!" with CAPS!
String "Бывают же адекватные заголовки" without CAPS!
String "1.1 Первый; 1.2. Второй; 1.3. Третий" without CAPS!
String "2.1. ПЕРВЫЙ; 2.2. ВТОРОЙ; 2.3. ТРЕТИЙ" with CAPS!
Это доступно в PHP с версии 5.1 (http://fi2.php.net/manual/ru/regexp.reference.unicode.php).
Ещё одна регулярка, которая также находит подряд идущие заглавные буквы: "/([[:upper:]]{2,})/u". Я посчитал среднее время работы скрипта с первой и второй регуляркой и вторая оказалась чуть быстрее. Так что пока не нашёл ещё более быстрый вариант, буду использовать "/([[:upper:]]{2,})/u" для поиска слов, написанных капсом.
Кстати, заглавные буквы вовсе не означают абсолютное зло, - может быть вполне нормальная аббревиатура. Так что после нахождения "проблемных" строк, нужно дальше думать, как с ними поступить.

Комментарии

Популярные сообщения из этого блога

Пропорциональное распределение суммы

Битрикс: своя геолокация

Битрикс: два способа отправить файл