[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: как работает функция substr?
Гость_lionsay
Добрый вечер. Сам я даже не начинающий программист, а просто любитель. Начал изучать php по книге Робина Никсона "PHP, MySQL и JavaScript" и на прошлой неделе остановился на одном месте и бросил. Теперь все же хочется выяснить почему же не работает данный пример из книги:
<?php
$number = 12345 * 67890;
echo substr($number, 3, 1)';
?>

Я так понял, что команда echo должен отобразить какой-то результат в браузере, но у меня ничего не происходит.

Использую Eclipse+PDT(кстати, классная штука), стандартный пакет LAMP+phpmyadmin и бразуер Firefox 4, уже 5.



Спустя 2 минуты, 29 секунд (27.06.2011 - 17:28) Гость_lionsay написал(а):
кодировка UTF-8

Спустя 13 минут, 28 секунд (27.06.2011 - 17:42) SoMeOnE написал(а):
echo substr($number, 3, 1)';

кавычку убери в конце...

Спустя 7 минут, 31 секунда (27.06.2011 - 17:49) lionsay написал(а):
Еще читал что substr не работает в utf-8 и советуют с префиксом mb_substr, но у меня в логе ошибок apache пишет
 PHP Parse error:  syntax error, unexpected T_ENCAPSED_AND_WHITESPACE

Спустя 12 минут, 9 секунд (27.06.2011 - 18:01) lionsay написал(а):
Цитата
<pre class="sh_sourceCode" rel="php"><span class="sh_function">echo substr</span><span class="sh_symbol">(</span><span class="sh_variable">$number</span><span class="sh_symbol">,</span> <span class="sh_number">3</span><span class="sh_symbol">,</span> <span class="sh_number">1</span><span class="sh_symbol">)</span><span class="sh_string">';</span></pre>
кавычку убери в конце...


Прошу прощения, я тогда изменял этот код как мог и сейчас скопировал этот код прямо из Eclipse. Вот правильный.
<?php
$number = 12345 * 67890;
echo substr($number, 3, 1);
?>

На сайте автора книги lpmj.net(сайт с кодами книги) код уже изменился так:
<?php
$number = 12345 * 67890;
echo substr($number, 4, 1);
?>

ссылка


Но, он все равно ничего не выводит "на обозрение" :).

Спустя 3 минуты, 12 секунд (27.06.2011 - 18:05) Игорь_Vasinsky написал(а):
А Google?

mb_substr
(PHP 4 >= 4.0.6
)

mb_substr - получает часть строки.

Описание
string mb_substr (string str, int start [, int length [, string encoding]])

mb_substr() возвращает часть строки str, специфицированную параметрами start и length.

mb_substr() выполняет многобайтную безопасную операцию substr() на основе количества символов. Позиция вычисляется относительно начала str. Позиция первого символа равна 0. Второго 1, и так далее.

Если encoding опущен, принимается внутренняя кодировка.

encoding это кодировка символов. Если опущена, используется внутренняя кодировка.



<?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
?>

Спустя 6 минут, 11 секунд (27.06.2011 - 18:11) lionsay написал(а):
Игорь_Vasinsky, Спасибо конечно, но я не осилил.

Спустя 6 минут (27.06.2011 - 18:17) Игорь_Vasinsky написал(а):
mb_ - библиотека для многобайтных кодировок, к коим и относится utf-8, такой префикс есть у многих функций, результат работы у них такой же.

Что касаемо твоей sustr() (mb_substr() - для UTF-8)- она возращает часть строки.

<?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
?>


Ты поэкспереминтируй - подставь вместо abcdef - свои значения - посмотри когда и как урезается.

По поводу - кодировки - ты проверь - действительно ли это UTF-8 (у меня в подписи линк)

Спустя 8 минут, 42 секунды (27.06.2011 - 18:25) lionsay написал(а):
Ок, спасибо. Про это в книге нет, хотя надо было бы написать это в начале.
У меня ведь в начале кириллические буквы вообще не показывались, где-то прочитал, что нужно в начале страницы писать:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

Спустя 5 минут, 37 секунд (27.06.2011 - 18:31) Админ написал(а):
$rest = mb_substr('abcdef', 0, 2,'utf8');
предпочтительней для кириллицы, иначе зябы вылезают
а страницу ты в какой кодировке сохраняешь ?

Спустя 7 минут, 19 секунд (27.06.2011 - 18:38) lionsay написал(а):
Цитата
а страницу ты в какой кодировке сохраняешь ?

smile.gif Незнаю. Я еще не знаю где в Eclipse сохранять в разных кодировках. Думал та строка задает кодировку. Да и линукс, кажется, обычно сохраняет в UTF-8.

Файл сохранил в UTF-8 в gedit.

Спустя 1 час, 27 минут, 24 секунды (27.06.2011 - 20:06) lionsay написал(а):
Все равно ничего не отображается в браузере.
<?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
?>


Все остальное отображается и интерпретируется, но все, что относится к substr и mb_substr, Увы! С кодировкой все нормально.
А у вас оно отображается?

Спустя 21 минута, 24 секунды (27.06.2011 - 20:27) alex12060 написал(а):
lionsay

Эта функция обрезает строку. Принимает 3 аргумента:
  • Строку для обрезки
  • Начало, откуда обрезаем
  • Длину обрезки.
Вообще, строки, как нумерованные массивы. Все нумерованные массивы имеют 2 части. Вот пример:


$test = 'Test';


Строку $test мы можем представить как массив, в котором есть порядковый номер, и значение, которое принадлежит номеру.

ПН - Порядковый номер
ЗН - Значение

ПЗ НЗ
0 | T |
1 | e |
2 | s |
3 | t |

Вот, начнем рассматривать примеры. Как видно, номера начинаются с 0, а не с 1.
Таким образом, можно вывести определенные символы со строки.


$test = 'test';

echo $text[0]; // t
echo $text[2]; // s
echo $text[3]; // t


Но этого недостаточно, если хотим вывести определенные кусок текста. Допустим, из строки превысокоблагорассматривающий часть слова - благо.

Нам известно начало и длинна. Есть все для начала:


$text = 'превысокоблагорассматривающий';

// Получаем часть строки:

echo substr($text, 9, 5); // не забываем, что начинаем считать с 0.


И на этом можно сделать кучу примеров, приведенных выше.

Но а для работы с UTF-8, используй это:


header('content-type: text/html; charset=utf-8');
mb_internal_encoding('UTF-8'); // Устанавливаем кодировку для mb

$text = 'превысокоблагорассматривающий';

// Получаем часть строки:

echo mb_substr($text, 9, 5); // не забываем, что начинаем считать с 0.


В общем, это как дополнение. Надеюсь, был полезен.

Спустя 26 минут, 11 секунд (27.06.2011 - 20:53) lionsay написал(а):
WOW!
alex12060, Спасибо, очень подбробно объяснено, то что нужно для новичка.

Спустя 29 минут, 1 секунда (27.06.2011 - 21:22) Invis1ble написал(а):
lionsay
Поставь в начале скрипта
error_reporting(E_ALL);
чтобы видеть, в чем причина. И найди в php.ini директиву
display_errors и поставь значение On:
display_errors = On

Ну и перезагрузи apache
Тогда ошибки будут отображаться на экране.

Спустя 33 минуты, 30 секунд (27.06.2011 - 21:56) Админ написал(а):
alex12060
Цитата
echo mb_substr($text, 9, 5); // не забываем, что начинаем считать с 0.

замечал несколько раз, если не указывать четвёртый параметр - ругаться начинает.

Спустя 12 минут, 32 секунды (27.06.2011 - 22:08) lionsay написал(а):
Прошу всех простить меня за нубство.
Invis1ble, Спасибо.

В общем, проблема была в этом:
Notice: Undefined variable: newsflash in /home/lionsay/www/nixon/phpproject.php on line 23 Notice: Undefined variable: bulletin in /home/lionsay/www/nixon/phpproject.php on line 23 


<?php
$msgs = 5;
echo "У вас " . $msgs . " сообщений.";
$bulletin .= $newsflash; (23 - строка)
echo "<br /";
?>

Я это по книге все проделывал в одном пхп файле, дурачился и экспериментировал. Теперь понял, что это влияет на другие куски кода.

Спустя 24 минуты, 46 секунд (27.06.2011 - 22:33) Invis1ble написал(а):
lionsay
пожалуйста. Логирование ошибок без вывода их на экран при разработке - зло, очень мешает многим новичкам.
Только я не совсем понял, каким образом неинициализированные переменные повлияли на код с substr(), ведь в том куске кода, который ты показал их нет =)


UPD. Хотя есть догадка, что причина была в незакрытом теге <br / из-за чего весь последующий вывод воспринимался браузером как продолжение тега

Спустя 20 минут, 32 секунды (27.06.2011 - 22:54) lionsay написал(а):
Нуу, этого я пока не знаю. Да, незакрытый тег не заметил, но все же проблема не в этом, кажись. Тег закрыл, но ошибка все равно возникает. Может ему не хватает переменной $newsflash со значением? smile.gif


Ан нет. Все же в этом и была проблема, как Вы и написали.

Спустя 7 минут, 53 секунды (27.06.2011 - 23:02) lionsay написал(а):
Все же жаль, что Eclipse не все ошибки находит.

Спустя 9 часов, 41 минута, 15 секунд (28.06.2011 - 08:43) alex12060 написал(а):
lionsay



<?php
$msgs = 5;
$newsflash = '';

echo "У вас " . $msgs . " сообщений.";
$bulletin .= $newsflash; (23 - строка)
echo "<br />";
?>

Спустя 34 секунды (28.06.2011 - 08:43) alex12060 написал(а):
Админ

Эт то да, но я использовал функцию mb_internal_encoding();
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.