php разбить строку на массив по нескольким разделителям

Разбиение и объединение строк в PHP

php разбить строку на массив по нескольким разделителям. Смотреть фото php разбить строку на массив по нескольким разделителям. Смотреть картинку php разбить строку на массив по нескольким разделителям. Картинка про php разбить строку на массив по нескольким разделителям. Фото php разбить строку на массив по нескольким разделителям

Для разбиения строки на элементы используется функция explode(), которая принимает два параметра: строку, которую необходимо разбить и разделитель. Рассмотрим функцию explode() сразу на примере:

В данном примере, мы создаём массив, элементами которого становятся «Lexus«, «Smirnov«, «40«. То есть мы, учитывая разделитель «/«, разбили эту строку на несколько и записали их в массив. Существует так же и операция разбиение строки на элементы и мгновенная запись их в переменные:

То есть в данном примере, мы создали три переменные, в каждую из которых записали соответствующее значение.

Теперь о применении данной функции. В своё время я реализовывал задачу поиска по сайту. И мне нужно было сформировать из GET-запроса, полученного из формы, запрос к базе данных, чтобы извлечь оттуда подходящие записи. Проблема была в том, что ведь могут искать несколько слов сразу, например, «создать сайт быстро«. И нужно вывести все материалы со словами «создать«, либо «сайт«, либо «быстро«. И мне приходилось использовать функцию explode(), а в качестве разделителя брался пробел. А уже затем я формировал запрос к базе данных (разумеется, с количеством OR зависящем от количества слов, либо AND, если пользователь потребовал вхождение всех слов) и извлекал подходящие записи из таблицы базы данных. Вообще, задача была на порядок тяжелее, но тут я привёл Вам её кусок, чтобы Вы поняли, что бывают ситуации, когда без этой функции очень трудно работать.

Для объединения строк в PHP имеется функция implode(), которая принимает тоже два параметра: разделитель и массив:

В результате получится строка: «15.10.1985«. Думаю, что здесь всё прозрачно.

Вот и всё, что касается разбиения и объединения строк в PHP.

php разбить строку на массив по нескольким разделителям. Смотреть фото php разбить строку на массив по нескольким разделителям. Смотреть картинку php разбить строку на массив по нескольким разделителям. Картинка про php разбить строку на массив по нескольким разделителям. Фото 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 не хотите связываться? Ну уж извитите, таких простых решений не бывает.

Михаил, при чем тут «не хотите связываться»? Я просто узнаю у вас все возможные варианты. Вы специалист, я новичок. Мне кажется это нормально, когда человек интересуется всеми возможными вариантами! И никто не ждет готовых решений! Если не хотите отвечать, так не отвечайте. А уж если, сделали возможность задавать вопросы, то тогда отвечайте без сарказма. Это же диалог! Зачем же показывать свое превосходство?!

Источник

PHP метод explode для разбиения строки с тремя примерами

Метод PHP explode используется для разбиения строки на заданное число подстрок.

Синтаксис метода

Пример использования PHP метода explode :

Пример использования explode для разбиения номера телефона

В этом примере мы объявили строковую переменную и присвоили ей номер телефона следующего формата:

После этого применили метод explode для разбиения строки с помощью дефиса ( тире ) в качестве разделителя. Возвращенный массив строк присвоили массиву.

Затем использовали цикл fогеасh для отображения значений элементов массива, которые являются подстроками номера телефона. Поскольку параметр limit не указан, весь номер телефона будет разбит на три подстроки:

php разбить строку на массив по нескольким разделителям. Смотреть фото php разбить строку на массив по нескольким разделителям. Смотреть картинку php разбить строку на массив по нескольким разделителям. Картинка про php разбить строку на массив по нескольким разделителям. Фото php разбить строку на массив по нескольким разделителям

Посмотреть демо и код

Пример с пробелом в качестве разделителя

В этом примере PHP explode переноса строки использован пробел в качестве разделителя. Для примера возьмем это строку:

This is explode tutorial that enables string split in PHP.

Наконец, применили функцию count() для вывода количества подстрок в массиве:

php разбить строку на массив по нескольким разделителям. Смотреть фото php разбить строку на массив по нескольким разделителям. Смотреть картинку php разбить строку на массив по нескольким разделителям. Картинка про php разбить строку на массив по нескольким разделителям. Фото php разбить строку на массив по нескольким разделителям

Посмотреть демо и код

Пример с параметром limit

Это пример, описанный выше, за исключением того, что здесь мы использовали параметр limit для указания количества разбиений в строке. Ниже показана строка, которая была использована:

This is explode tutorial that enables string split in PHP.

В PHP explode примере, когда мы использовали пробел в качестве разделителя, было возвращено всего 10 подстрок. На этот раз с помощью параметра limit было определено 5 разбиений:

php разбить строку на массив по нескольким разделителям. Смотреть фото php разбить строку на массив по нескольким разделителям. Смотреть картинку php разбить строку на массив по нескольким разделителям. Картинка про php разбить строку на массив по нескольким разделителям. Фото php разбить строку на массив по нескольким разделителям

Посмотреть демо и код

Для чего нужен метод explode

Метод explode ( PHP split ) используется для разбиения заданной строки. Допустим, что веб-форма принимает телефонный номер с кодом страны и области в следующем формате:

Нам нужно отделить код страны и области, которые разделены дефисом. Для разбиения телефонного номера можно воспользоваться explode с разделителем дефисом ( тире ) после принятия номера в качестве входного параметра.

Поскольку explode возвращает массив подстрок, метод explode разобьет номер в следующий массив элементов:

Как использовать функцию PHP explode

В функции PHP explode можно указать три параметра. Последний из них — необязательный, так как указывать количество разбиений ( максимальное количество подстрок ) необязательно.

Описание каждого параметра:

Если в explode array PHP аргумент limit является положительным, возвращаемый массив будет содержать максимальное количество элементов, при этом последний элемент будет содержать остаток строки.

Также можно использовать отрицательное значение. В этом случае все подстроки ( кроме последней ) будут возвращены.

Поскольку explode возвращает массив подстрок, то можно присвоить его массиву. После применения метода можно использовать цикл fогеаch, чтобы перебрать массив элементов, как показано в приведенных выше примерах.

Примечание: Также можно использовать метод str_split для преобразования строки в массив.

Пожалуйста, оставляйте свои мнения по текущей теме статьи. Мы крайне благодарны вам за ваши комментарии, подписки, отклики, дизлайки, лайки!

Источник

str_split

str_split — Преобразует строку в массив

Описание

Преобразует строку в массив.

Список параметров

Максимальная длина фрагмента.

Возвращаемые значения

Примеры

Пример #1 Пример использования str_split()

Результат выполнения данного примера:

Примечания

Функция str_split() производит разбивку по байтам, а не по символам, в случае использования строк в многобайтных кодировках.

Смотрите также

User Contributed Notes 40 notes

A proper unicode string split;

print_r(str_split($s, 3));
print_r(str_split_unicode($s, 3));

A new version of «str_split_unicode» prev.

heres my version for php4 and below

The manual don’t says what is returned when you parse a different type of variable.

This is the example:

= «Long» ; // More than 1 char
$str2 = «x» ; // Only 1 char
$str3 = «» ; // Empty String
$str4 = 34 ; // Integer
$str5 = 3.4 ; // Float
$str6 = true ; // Bool
$str7 = null ; // Null

I noticed in the post below me that his function would return an array with an empty key at the end.

So here is just a little fix for it.

I needed a function that could split a string from the end with any left over chunk being at the beginning of the array (the beginning of the string).

The documentation fails to mention what happens when the string length does not divide evenly with the chunk size. Not sure if the same behavior for all versions of PHP so I offer the following code to determine this for your installation. On mine [version 5.2.17], the last chunk is an array the length of the remaining chars.

The very handy str_split() was introduced in PHP 5, but a lot of us are still forced to use PHP 4 at our host servers. And I am sure a lot of beginners have looked or are looking for a function to accomplish what str_split() does.

Taking advantge of the fact that strings are ‘arrays’ I wrote this tiny but useful e-mail cloaker in PHP, which guarantees functionality even if JavaScript is disabled in the client’s browser. Watch how I make up for the lack of str_split() in PHP 4.3.10.

// The result is an email address in HTML entities which, I hope most email address harvesters can’t read.

>
print cloakEmail ( ‘someone@nokikon.com’ );
?>

###### THE CODE ABOVE WITHOUT COMMENTS ######

It’s mentioned in the Return Values section above («If the split_length length exceeds the length of string, the entire string is returned as the first (and only) array element»), but note that an input of empty string will return array(1) < [0]=>string(0) «» >. Interestingly an input of NULL will also return array(1) < [0]=>string(0) «» >.

revised function from tatsudoshi

The previous suggestion is almost correct (and will only working for strlen=1. The working PHP4 function is:

Even shorter version:

//place each character (or group of) of the
string into and array

the fastast way (that fits my needs) to replace str_split() in php 4 i found is this:

Источник

PHP разделил строку с разделителями на пары ключ / значение (ассоциативный массив)

у меня есть такая строка:

и я хотел бы, чтобы это был ассоциативный массив, чтобы я мог сделать:

Я знаю, что могу взорваться на обратной косой черте, но не уверен, как идти оттуда.

3 ответов

использовать простой regex via preg_match_all и array_combine часто самый короткий и самый быстрый вариант:

теперь это, конечно, особый случай. Оба!—46—>ключи и значения разделены \ обратная косая черта, как и все пары из них. Регулярное выражение также немного длиннее из-за необходимого двойного экранирования.

однако эта схема может быть обобщена на другие key:value, строк в стиле.

Distinct key:value, разделители

разрешить различные разделители

вы можете сделать его более гибким / прощающим, разрешив различные разделители между ключи/значения/пары:

когда как key=value,key2:value2++key3==value3 будет работать. Что может иметь смысл для более дружественных людей (он же нетехнические пользователи).

ограничить буквенно-цифровые клавиши

часто вы можете запретить что-либо, кроме классического key идентификаторы. Просто используйте \w+ word string pattern, чтобы регулярное выражение пропускало нежелательные события:

это самый тривиальный подход к белому списку. Если OTOH вы хотите утверждаю / предварительно ограничьте всю строку ключа / значения, затем создайте отдельную preg_match(«/^(\w+=[^,]+(,|$))+/», …

пробелы полосы или цитирование

вы можете пропустить несколько шагов после обработки (например, trim на ключах и значениях) с небольшим добавлением:

или, например, дополнительные цитаты:

извлечение в стиле INI

и вы можете создать базовое извлечение INI-файла метод:

обратите внимание, что это просто сырой подмножество общих схем INI.

альтернатива: parse_str()

если у вас key=value&key2=value2 строка уже есть, то parse_str работает как шарм. Но, объединив его с strtr может даже обрабатывать различные другие разделители:

, который имеет пару плюсы и минусы его собственный:

альтернатива: explode + foreach

вы найдете много примеров расширение строки ручного ключа / значения. Хотя это чаще всего код. explode несколько используется в PHP из-за оптимизационных предположений. После профилирования часто оказывается медленнее, однако из-за руководства foreach и коллекция массив.

как насчет чего-то вроде этого :

В принципе, здесь идея заключается в том, чтобы:

Я не так хорош с RegExp, но как насчет этого кода одной строки

Источник

Разбиваем строку на подстроки по разделяющим символам своими руками

Введение

Приветствую вас, дорогие читатели. В данной статье описана разработка функции разделения строк. Возможно, эта функция может стать для вас хорошей альтернативой, вместо функции 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() умеет возвращать новые подстроки (токены) из исходной строки, не меняя её. Однако она совершенно не умеет их экранировать, в случае, когда лексемы представляют собой более сложные объекты. Например, а что если лексема содержит символ, который мы выбрали в качестве разделителя?

Данные значения формируют следующую таблицу:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *