Москва, Строительный проезд, 7А кор. 4 Работаем: 24/7 +7 495 744 67 74

Обрезка текста — непонятный символ

Для того, чтобы решить проблему с «квадратиком» давайте поближе познакомимся с самой функцией substr() и что она умеет.

Если задать вопрос поисковой системе, что она знает о функции substr() то в ответ на свой вопрос получим множество ссылок, которые в основном будут сводится к одному — substr() возвращает подстроку строки string длиной length и тд. Какой-то заумный ответ, но все же, попытаемся в этом разобраться.

Функция substr (строка, number1, number 2) /с англ. – результат объединения двух слов subtract и string и означают они – подстрока/ — возвращает подстроку, начинающуюся с позиции number 1, и длиной number 2. Нумерация позиций начинается с нуля и в направлении —  слева направо, например

substr ( ‘Привет, мои читатели и мои гости’, 8, 10 );

Приведенный пример соответствует синтаксису функции substr(), а именно

string substr( string string, int start [, int length] )

то есть, substr() возвращает подстроку строки string, длиной length, начинающегося с start символа по счету. Длина строки length не обязательна и если ее не указывать, то в результате функция substr() предоставит всю строку, начиная с символа, номер которого совпадает с аргументом start.

Стоит подчеркнуть, что в случаи, когда start положительный (неотрицателен), то  результатом будет подстрока начинающаяся с позиции start от начала строки, считая от нуля. Иными словами, в строке ‘abcdef’, позиции 0 отвечает символ ‘a’, в позиции 2 — располагается символ ‘c’, и т.д.
<?php
$rest = substr(«abcdef», 1);    // возвращает «bcdef»
$rest = substr(«abcdef», 1, 3); // возвращает «bcd»
$rest = substr(«abcdef», 0, 4); // возвращает «abcd»
$rest = substr(«abcdef», 0, 8); // возвращает «abcdef»
// к отдельным символам можно обращаться с помощью фигурных скобок
$string = ‘abcdef’;
echo $string{0};     // выводит a
echo $string{3};    // выводит d
?>

Если start отрицательный отсчет будет производится с конца строки string, то есть
<?php
$rest = substr(«abcdef», -1);    // возвращает «f»
$rest = substr(«abcdef», -2);    // возвращает «ef»
$rest = substr(«abcdef», -3, 1); // возвращает «d»
?>

Но а если length положительный, что в таком случаи? В таком случае, длина возвращаемой строки будет не длиннее length символов. Если же длина строки string является меньше или равной start символов, возвращается FALSE.

При отрицательном значении length происходит игнорирование  указанное этим аргументом количества символов с конца строки string. Если при этом позиция начала подстроки, определяемая start, находится в игнорируемой части строки, то результатом будет пустая строка
<?php
$rest = substr(«abcdef», 0, -1);  // возвращает «abcde»
$rest = substr(«abcdef», 2, -1);  // возвращает «cde»
$rest = substr(«abcdef», 4, -4);  // возвращает «»
$rest = substr(«abcdef», -3, -1); // возвращает «de»
?>

С мат-частью закончили, перейдем непосредственно к конкретным примерам. Начнем с того, как будет выводится наше приветствие в кодировке cp1251
<?php
echo substr( ‘Привет, мои читатели и мои гости’, 8 ); //  мои читатели и мои гости
?>
И при отрицательном значении start
<?php
echo substr(‘Привет, мои читатели и мои гости’, -8 ); // гости
?>

Все работает хорошо, но вот это же приветствие в кодировке UTF-8 будет
<?php
substr ( ‘Привет, мои читатели и мои гости’, 8, 10 );  // ет, мо — или же «квадратики»
?>
Совсем плохо и далеко не то, что хотелось бы видеть в результате. Чтобы этого избежать нужно  указать кодировку и сделать это можно с помощью mb_substr

string mb_substr( string str, int start [, int length [, string encoding] ] )

то есть, mb_substr() возвращает часть строки str, специфицированную параметрами start и length. Этот атрибут выполняет многобайтную безопасную операцию substr( ), в основу которой положено количества символов. Позиция вычисляется относительно начала str и также с нуля – 0, 1, и тд. В случае, когда encoding не указан, принимается внутренняя, общая кодировка. Приняв это во внимание, исправим нашу оплошность
<?php
echo mb_substr( ‘ Привет, мои читатели и мои гости’, 8, 10, ‘UTF-8’ ); // мои читатели
?>

Еще. Обозначить кодировку выводимой надписи, текста можно еще в таком варианте
<?php
mb_internal_encoding( ‘UTF-8’ );
echo mb_substr( ‘ Привет, мои читатели и мои гости’, 8, 10, ‘UTF-8’ ); // мои читатели
?>
С представленного примера следует, что если кодировку хотим обозначить отдельной строкой, то в самой уже функции – ее обозначение отсутствует. Но следует подчеркнуть, что такой вариант будет работать только в случаи присутствия на сервере библиотеки — php_mbstring.dll

Таким образом, если, например, на сайте под управлением CMS Joomla, в результате «обрезки» текста наблюдаем набор символов или «квадратики» необходимо в функции substr указать кодировку или же заменить substr на mb_substr или utf8_substr.


адрес

г. Москва, Строительный пр., 7Ак4

телефон

+7 495 744 67 74Круглосуточно
Яндекс.Метрика

Если у Вас есть вопросы, жалобы или предложения по работе нашей компании, напишите нам Нам важно любое мнение. Спасибо.