Функции Язык программирования PHP

strtok

(PHP 3, PHP 4 )

strtok - лексемизация/Tokenize строки.

Описание

string strtok (string arg1, string arg2)

strtok() разделяет строку (arg1) на небольшие строки (лексемы/tokens), где каждая строка отделена символом из arg2. То есть, если у вас имеется, например, строка "This is an example string", вы можете лексемизировать её на отдельные слова с применением пробела как разделителя.
Пример 1. strtok()
$string 
= "This is\tan example\nstring"; /* Использовать также символы tab и newline как 
лексемизирующие символы */ $tok = strtok($string," \n\t"); while ($tok) { echo 
"Word=$tok<br>"; $tok = strtok(" \n\t"); }

Заметьте, что только первый вызов strtok использует аргумент string. Каждый последующий вызов strtok только использует лексему и отслеживает таким образом, где он находится в текущей строке. Для старта сначала или для лексемизации новой строки вы просто вызываете strtok снова с аргументом string для его инициализации. Заметьте, что вы можете поместить несколько лексем в параметр token. Строка будет лексемизироваться, если найден какой-нибудь один из символов из этого аргумента.

Поведение в случае обнаружения пустой части было изменено в PHP 4.1.0. Старое поведение - возвращалась пустая строка, новое, корректное - эта часть строки просто пропускается:
Пример 2. Старое поведение strtok()
$first_token 
= strtok('/something', '/'); $second_token = strtok('/'); var_dump ($first_token, 
$second_token); /* Выводится: string(0) "" string(9) "something" */
Пример 3. Новое поведение strtok()
$first_token = strtok('/something', '/'); $second_token = strtok('/'); var_dump 
($first_token, $second_token); /* Выводится: string(9) "something" bool(false) 
*/

Имейте также в виду, что ваши лексемы могут быть равны "0". Это даёт FALSE в условных выражениях.

См. также split() и explode().


Назад Оглавление Вперёд
strstr Вверх strtolower

Рекурсивные патэрны

Рассмотрим проблему совпадения строки в скобках, когда допускается неограниченное вложение скобок. Без использования рекурсии лучшее, что можно сделать, это использовать патэрн, который совпадает на некоторую фиксированную глубину вложения. Невозможно обработать вложения на произвольно большую глубину. В Perl 5.6 имеется экспериментальная возможность, позволяющая (помимо прочего) выполнять рекурсию регулярных выражений. Специальный элемент (?R) предоставлен для этого специфического case/варианта рекурсии.
PCRE-патэрн разрешает проблему скобок (предполагая, что опция PCRE_EXTENDED установлена так, что пробел игнорируется):

\( ( (?>[^()]+) | (?R) )* \)

Вначале он совпадает с открывающей скобкой. Затем - с любым количеством подстрок, которые могут быть либо последовательностями не-скобок, либо рекурсивным совпадением самого патэрна (т.е. корректно заключённой в скобки подстрокой). Наконец, идёт закрывающая скобка.

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

(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()

то он быстро даст "нет совпадений". Однако, если однократный/once-only субпатэрн не используется, поиск совпадения будет продолжаться длительное время, так как есть много различных способов, которыми повторения + и * могут кроить строку-субъект, и все они должны быть проверены, прежде чем будет выдано сообщение о неудаче поиска.