php разбить строку на массив по пробелам
Разбиение и объединение строк в PHP
Для разбиения строки на элементы используется функция explode(), которая принимает два параметра: строку, которую необходимо разбить и разделитель. Рассмотрим функцию explode() сразу на примере:
В данном примере, мы создаём массив, элементами которого становятся «Lexus«, «Smirnov«, «40«. То есть мы, учитывая разделитель «/«, разбили эту строку на несколько и записали их в массив. Существует так же и операция разбиение строки на элементы и мгновенная запись их в переменные:
То есть в данном примере, мы создали три переменные, в каждую из которых записали соответствующее значение.
Теперь о применении данной функции. В своё время я реализовывал задачу поиска по сайту. И мне нужно было сформировать из GET-запроса, полученного из формы, запрос к базе данных, чтобы извлечь оттуда подходящие записи. Проблема была в том, что ведь могут искать несколько слов сразу, например, «создать сайт быстро«. И нужно вывести все материалы со словами «создать«, либо «сайт«, либо «быстро«. И мне приходилось использовать функцию explode(), а в качестве разделителя брался пробел. А уже затем я формировал запрос к базе данных (разумеется, с количеством OR зависящем от количества слов, либо AND, если пользователь потребовал вхождение всех слов) и извлекал подходящие записи из таблицы базы данных. Вообще, задача была на порядок тяжелее, но тут я привёл Вам её кусок, чтобы Вы поняли, что бывают ситуации, когда без этой функции очень трудно работать.
Для объединения строк в PHP имеется функция implode(), которая принимает тоже два параметра: разделитель и массив:
В результате получится строка: «15.10.1985«. Думаю, что здесь всё прозрачно.
Вот и всё, что касается разбиения и объединения строк в PHP.
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Комментарии ( 19 ):
в функции explode(‘http://myrusakov.ru/’, «Lexus/Smirnov/40»); вместо знака / отображет ссылку на твой сайт.
Спасибо большое! Уже подправил.
Надо проверять не количество, а сами элементы. А слеш действительно добавит новый элемент, который будет пустой строкой.
Я правильно понимаю, что нужно в цикле for перебирать все элементы и функцией isset проверять их наличие? А как же мне проверить их общее количество? Соответствие количества главнее.
Не isset(), а просто значение. И да, через цикл.
Михаил, добрый день! Я правильно вас понял if ($hum1[$i]== 0)?
Михаил, спасибо! Все получилось! Подскажите, каким образом можно передать информацию из php в html? Читать ваши уроки по порядку не получается (много забывается сразу), поэтому изучаю php по мере решения задач. Спасибо!
Ну так я и выполняю упражнения, только свои. У вас на сайте, к сожалению, не нашел упражнений. Или я чего то не увидел?
На сайте упражнений нет, они есть в этом курсе: http://srs.myrusakov.ru/kurs
А мне кажется это хорошая идея сделать на сайте тесты для новичков примерно такие же как в курсе. почему вы не отреогировали?
Михаил, добрый день! Я немного неправильно сформулировал свой вопрос. Есть форма, которая передает данные в php. Там данные обрабатываются и выводятся на форму html. Мне нужно совместить две формы html в одну. Т.е. сверху ввожу, нажимаю «рассчитать» и снизу получаю ответ. Как передать информацию из php в ту же форму, из которой взяты первичные данные.
Раз хотите чтобы Вам именно в html выводилось, можете использовать javascript http://myrusakov.ru/javascript-post.html
А какие еще есть варианты? У меня блог на WP. Есть страничка, в которой поля для ввода данных. Есть возможность для вывода прямо на страницу?
Вы и html всё хотите оставить, и с javascript не хотите связываться? Ну уж извитите, таких простых решений не бывает.
Михаил, при чем тут «не хотите связываться»? Я просто узнаю у вас все возможные варианты. Вы специалист, я новичок. Мне кажется это нормально, когда человек интересуется всеми возможными вариантами! И никто не ждет готовых решений! Если не хотите отвечать, так не отвечайте. А уж если, сделали возможность задавать вопросы, то тогда отвечайте без сарказма. Это же диалог! Зачем же показывать свое превосходство?!
Разбиваем строку на подстроки по разделяющим символам своими руками
Введение
Приветствую вас, дорогие читатели. В данной статье описана разработка функции разделения строк. Возможно, эта функция может стать для вас хорошей альтернативой, вместо функции strtok из стандартной библиотеки языка Си.
Для разработки использовался компилятор gcc. Код писался под стандарт C99. Он несовместим с С90 из-за наличия объявлений с присваиванием (вида var a = val; а не var a;), а также объявлений в конце функций. Используемые флаги компилятора:
Вообще говоря, сама задача разбиения строк на подстроки, каждая из которых отделена в исходной строке определённым символом, является довольно распространённой. Очень часто необходимо извлечь из строки слова, разделённые пробелами. Конечно, в стандартной библиотеке языка Си уже есть функция strtok (заголовочный файл ), но она имеет свои побочные эффекты, перечисленные ниже.
Функция модифицирует исходную строку, разбивая её на лексемы. Она возвращает указатель на саму лексему, или NULL, в случае, когда нет больше лексем. Подробнее о ней можно прочитать здесь.
Так как функция модифицирует строку, то при передачи ей строчного литерала, будет получено SEGV, поскольку память для таких литеральных строк выделяется в сегменте кода, доступного только для чтения.
Для последующих вызовов, функции необходимо передавать нулевой указатель (литерал NULL), чтобы она могла продолжить сканирование с последней распознанной лексемы (предыдущего вызова).
Она не учитывает экранирование символов разделителей.
В виду вышеуказанных причин, мной было принято решение написать свой вариант функции strtok. Новая функция должна выполнять задачу старой, но со следующими ограничениями:
Не менять оригинальную строку, в которой ищутся лексемы.
Для каждой найденной лексемы создавать новую строку.
Иметь однородную последовательность вызовов.
Иметь возможность экранировать символы разделители, при сложных лексемах.
Иметь возможность работать со строковыми литералами (константами).
Основные шаги при разделении строк
При определении подстрок разделённых между собой каким-либо символом, прежде всего необходимо иметь возможность определять его наличие в строке.
Также необходимо устранить последовательность символов разделителей в начале и в конце строки, для корректной работы функции разбиения.
Наконец, для выделения памяти необходимо будет написать функцию, учитывающая исключительную ситуацию при работе с памятью (ошибки вида SEGV), а также макрос, позволяющий кратко писать вызов такой функции.
Разработка функции
Приступим к разработке. Для начала определим заголовочный файл «str_utils.h», содержащий все прототипы необходимых функций. Реализации функций положим в файл «str_utils.c«.
Её реализация определена следующим образом (файл «str_utils.c»):
Данная функция возвращает позицию символа в строке, увеличенную на единицу. Она не учитывает нулевой символ. Если символ не был найден или ей передали NULL,, функция вернёт 0. Её удобно использовать в цикле while, при проверке текущего символа строки на его наличие в другой строке.
Для инкапсуляции работы с памятью был определён отдельный заголовочный файл «mem.h», содержащий следующие прототипы:
Соответствующие функции реализованы в отдельном файле «mem.c»:
Они выделяют блок памяти в куче, содержащий указанное количество байт, а также дополнительно его обнуляют (функция alloc_mem).
Функция обрезки разделителей строки trim_separators выглядит следующим образом:
В начале мы проверяем на NULL аргументы функции. Если они нулевые, то возвращаем NULL.
Далее, через указатель sp, проходим строку слева направо, пока мы встречаем символы из строки separators. Если мы прошли всю строку, значит она целиком и полностью состоит из сепараторов, следовательно надо удалить все символы, или же просто вернуть NULL.
Аналогично, далее через указатель sp2, проходим строку справа налево, проверяя, находится ли текущий символ в массиве separators. Если это не так, то мы прерываем цикл, а указатели будут содержать ссылку на первые символы, не являющимися разделителями. Если мы опять прошли всю строку, значит снова придётся удалять всю строку, следовательно, возвращаем NULL.
Наконец, вычисляем длину строки. Если указатели ссылаются на одно и то же место, то в строке был лишь один символ, не являющийся разделителем, а потому размер результата будет равным 1 байту (один лишний байт для нулевого символа учтён в макросе alloc_str). Если же этот единственный символ является нулевым (маркером конца), то возвращаем NULL. Иначе берём разницу между адресами указателями, прибавляем к ней единицу, и получаем длину новой строки. Затем мы просто выделяем память для новой строки и копируем в неё строку, начинающуюся с указателя sp.
Теперь, объединим работу выше написанных функции, в единую функцию get_token().
Код функции get_token дан ниже:
В ней используется функция обрезки trim_separators(). Функция обрезки возвращает новую строку, и далее сканирование ведётся по ней. В цикле лишь проверяется, не равен ли текущий символ какому-либо символу разделителю из массива символов delims, и если равен, то выйти из цикла. Указатель src_p проходит по сканируемой строке. После цикла он будет указывать на символ, следующий за лексемой (конец лексемы). А начало лексемы сохраняется в указателе lex_begin, который изначально указывает на начало обрезанной, сканируемой строки. После обнаружения границ лексемы, вычисляется её размер (её число символом), а затем сканируемая строка удаляется из динамической кучи. Затем указатели переустанавливаются на позиции в оригинальной строке (первый аргумент функции get_token()), а часть строки, которая ещё не была разобрана, присваивается в качестве содержимого двойному указателю next. Обратите внимание, что next является ссылкой на другой указатель (в данном случае, на указатель строки). Двойной указатель позволяет менять значение переменной типа char *, записывая новый адрес в next. Для первого вызова данной функции, next должен хранить адрес переменной указателя, которая указывает на строку и хранит адрес первой ячейки строки. Однако, при работе с двойным указателем возможна серьёзная и незаметная ошибка, если в качестве начального значения next передать адрес переменной, которая непосредственно указывает на строку, а не адрес переменной копии, которая содержит копию адреса строки. В следующем разделе подробно описана данная ситуация, и показан пример работы данной функции.
Пример работы get_token()
Вывод данной программы:
Обратите внимание, что в цикле есть дополнительная проверка на NULL указателя tok. Дело в том, что при получении последнего слова в строке (а именно «cat.\n»), указатель next будет указывать на подстроку, состоящую лишь из одних пробелов (плюс нулевой символ). Функция trim_separators() для таких строк возвращает NULL, так как по логике придётся урезать все символы в строке. В итоге get_token() также вернёт NULL, поскольку уже ничего не осталось для сканирования. Поэтому переменная tok сохранит значение NULL, на последнем шаге.
Теперь снова по поводу двойного указателя next. Как вы могли заметить, в вышеприведённом коде ему передаётся адрес переменной copytest, а не переменной test. Дело в том, что мы можем нечаянно затереть значение переменной test (именно переменной, а не самой строки). Для примера, изменим код следующим образом. Передадим адрес test в указатель next. В итоге мы получим следующий вывод.
Как видите, сама строка не меняется, но изменилось значение переменной test. Теперь она содержит NULL, поскольку на последнем шаге, функция присваивает ей соответствующее значение. Отсюда следует, что операции вида:
с двойными указателями (указатель на указатель), тройными, и какой-либо сколь угодно длинной цепочкой указателей создают побочный эффект.
Модификация функции get_token(). Экранирование разделителей
Функция get_token() умеет возвращать новые подстроки (токены) из исходной строки, не меняя её. Однако она совершенно не умеет их экранировать, в случае, когда лексемы представляют собой более сложные объекты. Например, а что если лексема содержит символ, который мы выбрали в качестве разделителя?
Данные значения формируют следующую таблицу:
Разбить текст в массив по строкам
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Разбить текст в массив по заданным знакам
Добрый день, прошу Вас помочь в следующей ситуации. Есть текст: tex tex text text
Разбить текст на слова и потом снова собрать в текст
Здравствуйте! Подскажите пример разбиения текста на слова и потом сборка их снова в текст. Суть в.
Как сделать, чтоб текст разбивался по строкам?
привет! Подскажите пожалуйста, вывожу на страницу комментарии из БД:
Лучше регуляркой /\r\n?|\n/
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Разбить текст
Есть текст, как разбить его так, чтобы после каждых 50 символов ставился тег
?
Разбить массив на несколько по строкам
Добрый день! Понадобилось преобразовать данные, не могу понять как. Нужно массив разбить на.
Как разбить текст занесенный в Memo на массив
Как разбить текст занесенный в Memo на массив? чтобы каждое слово было элементом массива?
split
split — Разбиение строки на массив по регулярному выражению
Эта функция объявлена УСТАРЕВШЕЙ в PHP 5.3.0, и УДАЛЕНА PHP 7.0.0.
Есть следующие альтернативы:
Описание
Разбивает строку string на массив по регулярному выражению.
Список параметров
Регулярное выражение, чувствительное к регистру.
Возвращаемые значения
Примеры
Пример #1 Пример использования split()
Получаем первые четыре поля строки из /etc/passwd :
Пример #2 Пример использования split()
Распознаем дату, отформатированную с использованием слешей, точек или дефисов:
Примечания
Смотрите также
User Contributed Notes 25 notes
In response to the getCSVValues() function posted by justin at cam dot org, my testing indicates that it has a problem with a CSV string like this:
To fix this, I changed the second substr_count to look for an odd number of quotes, as opposed to any quotes at all:
moritz’s quotesplit didn’t work for me. It seemed to split on a comma even though it was between a pair of quotes. However, this did work:
//$instring toggles so we know if we are in a quoted string or not
$delimlen = strlen($splitter);
$instring = 0;
strange things happen with split
If you want to use split to check on line feeds (\n), the following won’t work:
Took me a little while to figure out.
It’s evident but not mentioned in the documentation that using asterisks is more restricted than in a normal regular expression.
for exaple you cannot say:
because what if there’s no «;» separator?(which is covered by this regular expression)
so you have to use at least
I’ve try using split function.
I use charset UTF-8. When I use char � the split function ad an empty string between «2» and «12». Why?
UTF-8 charset codes some characters (like the «�» character) into two bytes. In fact the regular expresion «[�]» contains 4 bytes (4 non-unicode characters). To demonstrate the real situation I wrote following example:
In answer to gwyne at gmx dot net, dec 1, 2002:
For split(), when using a backslash as the delimiter, you have to *double escape* the backslash.
A correction to a earlier note
If you want to use split to check on line feeds (\n), the following won’t work:
Took me a little while to figure to do
The following has worked for me to get a maximum of 2 array parts separated by the first new line (independant if saved under UNIX or WINDOWS):
$line = preg_split(‘/[\n\r]+/’,$input_several_lines_long,2);
Also empty lines are not considered here.
[Ed. note: Close. The pipe *is* an operator in PHP, but
the reason this fails is because it’s also an operator
in the regex syntax. The distinction here is important
since a PHP operator inside a string is just a character.]
The reason your code:
didn’t work is because the «|» symbol is an operator in PHP. If you want to use the pipe symbol as a delimiter you must excape it with a back slash, «\|». You code should look like this:
split() doesn’t like NUL characters within the string, it treats the first one it meets as the end of the string, so if you have data you want to split that can contain a NUL character you’ll need to convert it into something else first, eg:
Thank you Dave for your code below. Here is one change I made to avoid a redundant quote at the end of some lines (at least when I used excel:
// Is the last thing a quote?
if ($trim_quote) <
// Well then get rid of it
—$length;
// ADD TO FIX extra quote
—$length;
>
wchris’s quotesplit assumes that anything that is quoted must also be a complete delimiter-seperated entry by itself. This version does not. It also uses split’s argument order.
//$instring toggles so we know if we are in a quoted string or not
$delimlen = strlen($splitter);
$instring = 0;
Though this is obvious, the manual is a bit incorrect when claiming that the return will always be 1+number of time the split pattern occures. If the split pattern is the first part of the string, the return will still be 1. E.g.
$a = split(«zz,» «zzxsj.com»);
count($a);
The return of this can not in anyway be seperated from the return where the split pattern is not found.
I’d like to correct myself, I found that after testing my last solution it will create 5 lines no matter what. So I added this to make sure that it only displays 5 if there are five newlines. 🙂
Those of you trying to use split for CSV, it won’t always work as expected. Instead, try using a simple stack method:
>
else <
// It’s a closing quote
$quote_open = false ;
// Trim the last quote?
$trim_quote = true ;
>
?>
This *should* work for any valid CSV string, regardless of what it contains inside its quotes (using RFC 4180). It should also be faster than most of the others I’ve seen. It’s very simple in concept, and thoroughly commented.
If you need to do a split on a period make sure you escape the period out..
$ext_arr = split(«\.»,»something.jpg»);
. because
$ext_arr = split(«.»,»something.jpg»); won’t work properly.
Actually, this version is better than the last I submitted. The goal here is to be able to engage in *multiple* delimeter removal passes; for all but the last pass, set the third value to «1», and everything should go well.
//$instring toggles so we know if we are in a quoted string or not
$delimlen = strlen($splitter);
$instring = 0;
strtok
(PHP 4, PHP 5, PHP 7, PHP 8)
strtok — Разбивает строку на токены
Описание
Альтернативная сигнатура (не поддерживается с именованными аргументами):
Заметьте, что исходная строка ( string ) передаётся только при первом вызове этой функции. Последующим вызовам передаются только разделители ( token ), так как эта функция сохраняет исходную строку и запоминает позицию в этой строке между вызовами. Для работы с новой строкой ( string ) нужно снова вызвать функцию с двумя аргументами. Обратите внимание, что в параметре token можно использовать несколько разделителей. Строка будет делиться по любому найденному символу, присутствующему в параметре ( token ).
Список параметров
Строка ( string ), разбиваемая на подстроки (токены).
Возвращаемые значения
Примеры
Пример #1 Пример использования strtok()
Пример #2 Способ обработки пустых подстрок функцией strtok()
Результат выполнения данного примера:
Пример #3 Различие между strtok() и explode()
Результат выполнения данного примера:
Примечания
Смотрите также
User Contributed Notes 19 notes
If you have memory-usage critical solution, you should keep in mind, that strtok function holds input string parameter (or reference to it?) in memory after usage.
Simple way to tokenize search parameters, including double or single quoted keys. If only one quote is found, the rest of the string is assumed to be part of that token.
This looks very simple, but it took me a long time to figure out so I thought I’d share it incase someone else was wanting the same thing:
this should work similar to substr() but with tokens instead!
although its far from a clone, this was inspired by mIRC’s gettok() function
As of the change in strtok()’s handling of empty strings, it is now useless for scripts that rely on empty data to function.
Take for instance, a standard header. (with UNIX newlines)
http/1.0 200 OK\n
Content-Type: text/html\n
\n
—HTML BODY HERE—
When parsing this with strtok, one would wait until it found an empty string to signal the end of the header. However, because strtok now skips empty segments, it is impossible to know when the header has ended.
This should not be called `correct’ behavior, it certainly is not. It has rendered strtok incapable of (properly) processing a very simple standard.
This new functionality, however, does not affect Windows style headers. You would search for a line that only contains «\r»
This, however, is not a justification for the change.
@maisuma you invert paramaters of explode() and strtok() functions, your code does not do what you expect.
You expect to read the input string token after token so equivalent code for strtok() is arra_filter(explode()) because explode() return lines of empty string when several delimiters are contiguous in the read string, for example 2 whitespaces between.
Note that strtok may receive different tokens each time. Therefore, if, for example, you wish to extract several words and then the rest of the sentence:
If you want to tokenize by only one letter, explode() is much faster compared to strtok().
?>
The result is : (PHP 5.3.3 on CentOS)
explode():0.001317024230957 sec.
strtok():0.0058917999267578 sec.
explode() is about five times fast in short strings, too.
Here is a java like StringTokenizer class using strtok function:
Here’s a simple class that allows you to iterate through string tokens using a foreach loop.
I found this useful for parsing user entered links in text fields.
this example will hopefully help you understand how this function works:
This function takes a string and returns an array with words (delimited by spaces), also taking into account quotes, doublequotes, backticks and backslashes (for escaping stuff).
So
$string = «cp ‘my file’ to `Judy’s file`»;
var_dump(parse_cli($string));
Here is a small function I wrote as I needed to extract some named tokens from a string (a la Google). For example, I needed to format a string like «extension:gif size:64M animated:true author:’John Bash'» into
array(
‘extension’ => ‘gif’,
‘size’ => ’64M’,
‘animated’ => true,
‘author’ => ‘John Bash’
)
( ‘Content-type: text/plain; charset=utf-8’ );
$spaces = » \t\n\r» ; // space characters
$str = «check1: test »
. «check2:’hello world’ »
. ‘check3: «foo» ‘
. «check4: \\\»try this\\\»»
. ‘»buz» ‘
. ‘check1:true’ ;