Онлайн-справочник по самым часто задаваемым вопросам из темы "Как сделать?" на форуме QSP.su
Функции
$CURACTS
`$CURACTS` — данная функция возвращает выведенные на экран действия в виде кода QSP, как текстовое значение.
Действия сохраняются как набор операторов `act` с cответствующими параметрами и операциями.
Записав возвращённое функцией значение в переменную, можно восстановить действия с помощью оператора `dynamic`. Пример:
$actlist=$curacts
! восстанавливаем действия из переменной
dynamic $actlist
$CURLOC
`$CURLOC` — функция возвращает название текущей локации, т.е. локации, в которой "находится" игрок.
Технически это следует понимать так. В момент запуска игры плеер начинает выполнять код самой первой локации в игре, а когда код выполнен, плеер "останавливается" и ждёт участия игрока. Игрок может нажимать различные кнопки в игре, ссылки и выбирать пункты меню, что приводит к выполнению других блоков кода (например, действий) и переходам на новые локации по `goto` или `xgoto`. При таких переходах плеер вновь выполняет код других локаций и, когда код выполнен, "останавливается".
Так вот, когда на локацию осуществлён непосредственный переход (т.е. по `goto` или `xgoto`, либо это самая первая локация в игре), `$curloc` начинает возвращать название этой локации, — во всё время, пока выполняется код, и когда плеер "останавливается". Если после остановки не происходит переход по `goto`/`xgoto`, значение, которое возвращает `$curloc`, не меняется.
Пример использования:
$DESC
`$DESC` — возвращает текст базового описания локации с заданным названием. Общая запись:
, где `[$локация]` — это название интересующей нас локации. Например:
$desc('каморка_под_лестницей')
!возвращаем базовое описание текущей локации
$desc($curloc)
Если в базовом описании присутствуют подвыражения, функция автоматически раскрывает их.
Использование данной функции имеет смысл только если вы работает в редакторе `Quest Generator`, поскольку лишь из этого редактора доступно редактирование поля "Базовое описание" локации.
$DYNEVAL (DYNEVAL)
`DYNEVAL` — выполняет код, переданный в виде строки текста, и возвращает результат, если он есть. Общая запись:
DYNEVAL([$код],[аргумент 0],[аргумент 1], ... ,[аргумент 8])
, где `[$код]` — это обычный код QSP, записанный в виде текста. Выполнение такого кода аналогично выполнению кода функции `FUNC`. Аргументы `[аргумент 0]`, `[аргумент 1]` и т.д. могут использоваться внутри `[$код]`, их значения автоматически помещаются в переменные `args[0]`, `args[1]`, и т.д. соответственно.
Чтобы `dyneval` возвращала результат, необходимо внутри `[$код]` присвоить этот результат переменной `result`.
Примеры:
*pl $dyneval('$result = mid("abcd",2,1)+"qwerty"')
проход=dyneval("result = ($args[0] <> 'текст')", 'строка')
Результат функции равен значению `$result` при возврате строкового значения или `result` при возврате числового значения. если при выполнении кода были установлены и `result`, и `$result`, то предпочтение отдаётся строковому значению. После выполнения кода предыдущие значения `args` и `result` восстанавливаются, затем продолжается выполнение кода после `dyneval`.
См. также оператор `DYNAMIC`.
$FUNC (FUNC)
`FUNC` — выполнение кода указанной локации без непосредственного перехода на неё с возвращением значения.
Общая запись:
$FUNC([$локация],[аргумент 0],[аргумент 1], ... ,[аргумент 8])
, где `[$локация]` — это название локации, код которой мы хотим выполнить без непосредственного перехода на неё. Аргументы `[аргумент 0]`, `[аргумент 1]` и т.д. могут использоваться на этой локации, их значения автоматически помещаются в переменные `args[0]`, `args[1]`, и т.д. соответственно.
Базовое описание и список действий локации `[$локация]` добавляются к основному описанию и действиям старой локации. Так же происходит выполнение операторов в поле "Выполнить при посещении"
Результат функции равен значению `$RESULT` при возврате строкового значения или `RESULT` при возврате числового значения. Если при обработке локации были установлены и `RESULT`, и `$RESULT`, то предпочтение отдаётся строковому значению. После обработки локации предыдущие значения `ARGS` и `RESULT` восстанавливаются.
Примеры:
!Массив ARGS пуст.
яблоки = FUNC('функция')
!обработка локации с названием лежащим в переменной $name как функции. ARGS[0] равен 1.
pl func($name, 1) * 78
!обработка локации с названием в $name как функции.
!$ARGS[0] содержит строку "строка", ARGS[1] равен 2.
msg "text" + func($name, "строка", 2)
! код локации для функции, получающей сумму ряда чисел от единицы до указанного значения
# summ
! в args[0] будет помещено число, которое мы укажем в качестве [аргумента 0]
:for
if args[0]>0:
result=result+args[0]
args[0]=args[0]-1
jump 'for'
end
-----summ-----
! пример вызова локации "summ", как функции
*pl func("summ",19) & ! выведет на экран 190
! пример вызова с записью названия локации в переменную
$name_loc="summ"
*pl func($name_loc,23) & ! выведет на экран 276
$GETOBJ
`$GETOBJ` — возвращает название предмета в Окне предметов, расположенного в заданной позиции. Общая запись:
Индексация (нумерация) предметов в Окне предметов ведётся с 1. Если предмета с индексом `[номер предмета]` не существует, возвращается пустая строка (`''`).
Примеры:
$getobj(countobj) & ! вернёт название последнего добавленного предмета
Код, подсчитывающий в массиве `OBJECTS` число предметов с одинаковым названием:
:loop
if i<=countobj:
objects[$getobj(i)] = objects[$getobj(i)] + 1
i = i + 1
jump 'loop'
end
$IIF (IIF)
`IIF` — возвращает значение в зависимости от верности выражения.
Общая запись:
$IIF([#выражение],[$выражение_да],[$выражение_нет])
Если `[#выражение]` верно, возвращает значение выражения `[выражение_да]`, в противном случае возвращает значение выражения `[выражение_нет]`. При выполнении функции вычисляются значения всех трёх выражений.
Примеры:
abs_x=iif(x>0,x,-x)
!А следующая конструкция вызовет ошибку деления на ноль:
x=0
y=iif(x=0,0,1/x)
! типичное решение для вывода времени, чтобы не терять ноль на часах:
$iif(hour>9,$str(hour),"0"+$str(hour))+":"+$iif(minute>9,$str(minute),"0"+$str(minute))
$INPUT
`$INPUT` — возвращает интерпретатору введённый игроком текст, либо `''` (пустая строка), если была нажата кнопка "Отмена". Общая запись:
, где `[$текст]` — это приглашение в диалоговом окне, которое видит игрок. Например:
При выполнении данной команды на экране появится диалоговое окно с текстом "Как звать тебя, герой?", а выполнение остального кода приостановится, пока игрок не провзаимодействует с диалоговым окном.
Игрок может ввести или не ввести текст, и нажать кнопку "ОК" или "Отмена". Если игрок ввёл текст и нажал кнопку "ОК", функция `$input` вернёт переменной `$text` введённый игроком текст. Во всех остальных случаях после закрытия диалогового окна функция вернёт пустую строку (`''`).
Другие примеры:
if $input('Что приходит после тьмы?')='свет':
msg 'Все верно.'
else
msg 'Ответ не верный.'
end
! Пример реализации вопроса с несколькими вариантами ответа из которых любой будет правильным.
$answer =$trim($lcase($input('Ответить')))
if instr($answer,'красный') or instr($answer,'желтый') or instr($answer,'зеленый'): gt 'win'
! Введя красный или зеленый ил желтый произойдет переход на локацию 'win'
Допустимо, но не одобряется, использовать функцию для возвращения числовых значений:
Это может привести к различным ошибкам в игре, если игрок введёт в диалоговом окне не только цифры. Например:
Если игрок введёт вместо числа строку "24 года", плеер выдаст ошибку 101 "Несоответствие типов данных". Подобные ситуации должен предусматривать автор игры, а значит правильно будет озаботиться проверкой введённого значения уже после того, как функция $input будет выполнена.
! предлагаем игроку ответить на вопрос
! и присваиваем введённый текст переменной
$text=$input('Сколько вам лет?')
! если во введённом тексте содержатся не только цифры
! либо игрок не ввёл ответ
if isnum($text)<>-1 or $text="":
! предлагаем игроку снова ответить на вопрос
jump 'enter_text'
else
age=val($text)
end
$LCASE
`$LCASE` — возвращает строку маленьких букв, полученную изменением регистра букв исходной строки. Общая запись:
, где `[$текст]` — любая строка текста.
Примеры:
$lcase('Привет, Алиса!') & ! вернёт 'привет, алиса!'
$lcase('Я НЕ ХОЧУ НА ВАС ОРАТЬ.') & ! вернёт 'я не хочу на вас орать.'
$MAINTXT
`$MAINTXT` — возвращает текст, выведенный в окно основного описания.
Данная функция может быть полезна для замены части текста в окне основного описания, либо иной обработке текста. Пример:
*pl "Мы вывели на экран строку и в этой строке есть кусок, который мы хотим удалить."
! получаем текст из окна основного описания
$text=$maintxt
! вырезаем лишний кусок
$text_new=$replace($text," и в этой строке есть кусок, который мы хотим удалить")
! очищаем окно основного описания
*clr
! выводим новый текст
*p $text_new
$MAX (MAX)
`MAX` — возвращает максимальное из значений выражений-аргументов. Можно передавать от одного до девяти значений/аргументов. Если передан один аргумент, то считается, что указано имя массива. Общая запись:
$MAX([$выражение 1],[$выражение 2], ... ,[$выражение 10])
MAX([$название массива])
$MAX([$название массива])
Обратите внимание, при передаче одного аргумента поиск максимального элемента происходит среди строковых (если название массива указано со знаком `$`) или среди числовых значений элементов массива. Например:
$max('$b') & ! вернёт максимальное из строковых значений элементов массива "b"
Нельзя писать так и надеяться, что произойдёт поиск среди значений массива `a`:
Можно так:
max($b) & ! произойдёт поиск максимального значения среди элементов массива "a"
Другие примеры:
max(a,b,c) &! вернёт максимальное из значений переменных a,b,c
$max('aa','ab','zz') &! вернёт 'zz'
$MID
`$MID` — позволяет вырезать из строки её часть. Общая запись:
, где `[$строка]` — это строка текста, именно из неё функция вырезает часть, начиная с символа номер `[#начало]`, и длиной в `[#длина]` символов. Нумерация символов начинается с 1. Если отсутствует параметр `[#длина]`, вырезается часть до конца строки. Параметр `[#начало]` обязателен, и может в принципе принимать любые значения.
$mid('abcdef',2,3) & ! 'bcd'
$mid('abcdef',2) & ! 'bcdef'
$mid('abcdef') & ! 'ошибка [120] — неверное число аргументов оператора/функции'
$mid('abcdef',0) & ! 'abcdef'
$mid('abcdef',8) & ! ''
$MIN (MIN)
`MIN` — возвращает минимальное из значений выражений-аргументов. Можно передавать от одного до девяти значений/аргументов. Если передан один аргумент, то считается, что указано имя массива. Общая запись:
$MIN([$выражение 1],[$выражение 2], ... ,[$выражение 10])
$MIN([$название массива])
Обратите внимание, при передаче одного аргумента поиск минимального элемента происходит среди строковых (если название массива указано со знаком `$`) или среди числовых значений элементов массива. Например:
$min('$b') & ! вернёт минимальное из строковых значений элементов массива "b"
Нельзя писать так:
Можно так:
min($b) & ! произойдёт поиск максимального значения среди элементов массива "a"
Другие примеры:
min(a,b,c) & ! вернёт минимальное из значений переменных a,b,c
$min('aa','ab','zz') & ! вернёт 'aa'
$QSPVER
`$QSPVER` - возвращает версию интерпретатора в формате "X.Y.Z". Пример вызова:
$REPLACE
`$REPLACE` — общая запись:
Данная функция заменяет в строке `[$строка]` все вхождения строки `[$поиск]` строкой `[$замена]` и возвращает результат. Если `[$замена]` отсутствует или указана пустая строка, то удаляет в исходной строке все вхождения искомой строки. Примеры:
$replace('test', 'e', 's') & ! выведет на экран 'tsst'
$replace('test', 't', '34') & ! выведет на экран '34es34'
$replace('test', 't') & ! выведет на экран 'es'
$text="Строка текста с разными буквами."
! а новое значение вписать в другую переменную
$text_new=$replace($text,"ст","st")
*pl $text
*pl $text_new
$SELACT
`$SELACT` — возвращает название выделенного действия в любом месте игры.
Следует помнить, что выделение действия происходит при наведении на него указателя мыши, а не при непосредственном нажатии.
Пример использования можно посмотреть в разделе `$onactsel`
$SELOBJ
`$SELOBJ` — возвращает название выделенного предмета в любом месте игры. Выделение предмета происходит в момент нажатия (щелчка мышью по предмету) и не снимается до применения команды `unselect`.
Пример использования можно посмотреть в разделе `$onobjsel`
$STATTXT
`$STATTXT` — возвращает текст, выведенный в окно дополнительного описания. Может быть полезна для замены части текста в окне дополнительного описания.
$STR
`$STR` — возвращает строку текста, полученную переводом числа в строку. Общая запись:
Пример:
$STRFIND
`$STRFIND` — возвращает подстроку, соответствующую регулярному выражению, из указанной строки. Общая запись:
, где `[$строка]` — исходная строка, в которой производим поиск вхождения, соответствующего регулярному выражению `[$шаблон]`, или группе номер `[#номер]` в регулярном выражении. Если подстрока с указанным номером отсутствует, то возвращается пустая строка. Нумерация групп подстрок начинается с 1. Если параметр `[#номер]` отсутствует или равен 0, то возвращается подстрока, соответствующая всему регулярному выражению `[$шаблон]`
Например, возьмём регулярное выражение:
Метасимвол `\S` означает любой непробельный символ, а квантификатор `+` указывает, что непробельные символы должны присутствовать один или более раз. Таким образом запись `\S+` можно условно сопоставить слову. Каждое слово с помощью скобок `()` выделено в отдельную группу, а между группами присутствуют пробельные символы `\s`. Метасимволы `^` и `$` означают соответственно начало и конец строки. Таким образом наше регулярное выражение соответствует любой строке из трёх слов, разделённых пробелами.
Тогда:
! потому что согласно регулярному выражению строка должна начинаться
! с группы непробельных символов. Команда вернёт пустую строку ''
$strfind(' идти к пещере','^(\S+)\s(\S+)\s(\S+)$')
! а значит команда вернёт строку полностью 'идти к пещере'
$strfind('идти к пещере','^(\S+)\s(\S+)\s(\S+)$')=''
! однако третий аргумент указывает, какую именно группу из этого
! регулярного выражения мы хотим получить, поэтому каждая команда вернёт
! соответственно первое, второе и третье слова из строки
$strfind('идти к пещере','^(\S+)\s(\S+)\s(\S+)$',1) & ! вернёт 'идти'
$strfind('идти к пещере','^(\S+)\s(\S+)\s(\S+)$',2) & ! вернёт 'к'
$strfind('идти к пещере','^(\S+)\s(\S+)\s(\S+)$',3) & ! вернёт 'пещере'
! группу с последним пробельным символом. Квантификатор "?" указывает,
! что эта группа может как присутствовать в строке, так и отсутствовать:
$strfind('идти к пещере','^(\S+)\s(\S+)(\s(\S+))?$',4) & ! вернёт 'пещере'
$strfind('идти к пещере','^(\S+)\s(\S+)(\s(\S+))?$',3) & ! вернёт ' пещере'
! этому же регулярному выражению соответствует и такая строка
$strfind('искать ключ','^(\S+)\s(\S+)(\s(\S+))?$',1) & ! вернёт 'искать'
! а вот эта строка уже не соответствует регулярному выражению
$strfind('искать','^(\S+)\s(\S+)(\s(\S+))?$',1) & ! вернёт ''
Следующие примеры показывают, как `$strfind` возвращает часть строки, соответствующую регулярному выражению:
$strfind('идти к дому', 'к\s(\S+)', 1) & ! вернёт 'дому'
$strfind('идти к своему дому','к\s(\S+)',1) & ! вернёт 'своему'
$TRIM
`$TRIM` — возвращает указанную строку без прилегающих символов табуляции и пробелов. Общая запись:
Например:
$UCASE
`$UCASE` — возвращает строку больших букв, полученную изменением регистра букв исходной строки. Общая запись:
, где `[$текст]` — любая строка текста.
Примеры:
$ucase('Привет, Алиса!') & ! вернёт 'ПРИВЕТ, АЛИСА!'
$ucase('Я хочу на вас орать.') & ! вернёт 'Я ХОЧУ НА ВАС ОРАТЬ.'
$USER_TEXT ($USRTXT)
`$USER_TEXT` — в любом месте игры возвращает текст, который находится в строке ввода (поле ввода). Имеет краткую форму `$usrtxt`. Пример смотри в разделе `$usercom`.
ARRCOMP
`ARRCOMP` — возвращает индекс элемента массива, соответствующего регулярному выражению. Поиск начинается с элемента с заданным номером; индексация элементов массива ведётся с нуля. Если указанное значение не найдено, функция возвращает -1. Общая запись:
, где `[#начало]` — номер элемента массива, с которого следует начать поиск, `[$имя_массива]` — название массива, по которому нужно произвести поиск, `[$шаблон]` — регулярное выражение, с которым будет сравниваться искомый элемент.
Параметр `[#начало]` может отсутствовать, при этом его значение принимается равным 0. Поиск ведётся только среди текстовых элементов массива.
Важно! В более новых версиях плеера (например, в Quest Navigator) параметр `[#начало]` переставлен в конец:
Для примера возьмём вот такой массив:
$mass[1]=" иду в пещеру"
$mass[2]="не иду в пещеру"
$mass[3]="топаю к дому"
Нам нужно найти элемент, значение которого состояит из трёх слов. В грубом приближении слово — это набор из одного или более непробельных символов `\S+`, по бокам от которого могут стоять или не стоять символы пробела `\s`, отсюда мы можем составить вот такое регулярное выражение:
Остаётся только выяснить какой элемент массива соответсвует шаблону:
Если мы хотим проигнорировать первый элемент и начать поиск со второго:
А вот так мы можем вывести на экран значения всех элементов, содержащих слово "иду":
:for
index=arrcomp(pos,'$mass','(.*\s|^)иду(\s.*|$)')
if index<>-1:
$mass[index]
pos=index+1
jump 'for'
end
Другие примеры:
arrcomp(0,'$A','This')
! Поиск строки, соответствующей регулярному выражению "abc\d+"
! (первые два элемента массива игнорируются)
arrcomp(2,'$A','abc\d+')
! аналогично предыдущему примеру,
! но поиск осуществляется по всем элементам массива
arrcomp(0,'$A','.*string.*')
arrcomp('$A','This') & ! эквивалентно 1му варианту
ARRPOS
`ARRPOS` — возвращает индекс элемента массива, равного указанному значению. Поиск начинается с элемента с заданным номером; индексация элементов массива ведётся с нуля. Если указанное значение не найдено, функция возвращает -1. Общая запись:
, где `[#начало]` — номер элемента массива, с которого следует начать поиск, `[$имя_массива]` — название массива, по которому нужно произвести поиск, `[значение]` — число, или строка (в зависимости от типа массива), которое нужно найти в массиве.
Важно! В более новых версиях плеера (например, в Quest Navigator) параметр `[#начало]` переставлен в конец:
Для примера возьмём такой массив:
$color[1]='жёлтый'
$color[2]='зелёный'
$color[3]='синий'
$color[4]='жёлтый'
Нам нужно найти элемент со значением "жёлтый":
Если мы хотим проигнорировать первые два элемента:
Если мы хотим найти элемент со значением, которого нет в массиве:
Другие примеры:
arrpos(0,'$a','this')
! поиск числа 65 в массиве "a" (два элемента массива игнорируются)
arrpos(2,'a',65)
! поиск строки 'test' среди значений массива "$b"
arrpos('$b','test')
ARRSIZE
`ARRSIZE` — функция возвращает число элементов массива. Общая запись:
, где `[$имя_массива]` — название массива, размер которого хотим получить.
В силу особенностей движка плеера, не важно, указывается ли название текстового, или числового, массива, возвращено будет наибольшее значение. Для примера:
$a[1]='1'
a[0]=1
a[1]=2
a[2]=3
arrsize('$a') & ! вернёт значение 3
arrsize('a') & ! вернёт значение 3
$b[0]='0'
$b[1]='1'
$b[2]='2'
b[0]=1
b[1]=2
arrsize('$b') & ! вернёт значение 3
arrsize('b') & ! вернёт значение 3
COUNTOBJ
`COUNTOBJ` — возвращает количество предметов в инвентаре.
Номер последнего предмета в списке численно совпадает с количеством предметов, поэтому всегда можно получить название последнего предмета так:
INSTR
`INSTR` — возвращает номер символа, с которого начинается вхождение подстроки в строку. Общая запись:
, где `[#начало]` — это номер символа, с которого нужно начинать поиск, `[$строка]` — это текстовое значение (строка), по которому нужно производить поиск, а `[$подстрока]` — значение, которое мы ищем в указанной строке. Нумерация символов начианется с 1. Параметр `[#начало]` может отсутствовать, при этом он принимается равным 1.
Примеры:
instr('abcdefghijklm','abc') & ! вернёт число 1
Если ни одного вхождения указанной подстроки в строке нет, instr возвращает 0.
Пример:
Важно: в более новых версиях (Quest Navigator) необязательный параметр `[#начало]` переставлен в конец:
ISNUM
`ISNUM` — функция возвращает -1 (истина), если переданная строка является числом, и — 0, если строка не является числом. Общая запись:
, где `[$строка]` — любая строка текста.
При проверке учитываются знак `-` в начале, прилегающие пробелы и символы табуляции, но кроме того, если хотя бы один символ окажется не цифрой, функция вернёт 0 (ложь).
Примеры:
isnum(' -888') & ! вернёт -1
isnum('777a6') & ! вернёт 0
isnum('') & ! вернёт -1, так как нет ни одной не-цифры (пустая строка считается нулём)
ISPLAY
`ISPLAY` — функция проверяет, проигрывается ли в данный момент файл с указанным названием, и если проигрывается, возвращает -1. В противном случае функция возвращает 0. Общая запись:
, где `[$путь_к_файлу]` — путь к звуковому файлу относительно файла игры.
Пример:
LEN
`LEN` — возвращает длину указанной строки текста (количество символов). Общая запись:
, где `[$текст]` — любое текстовое значение.
Примеры:
len("тысячадевятьсотвосьмидесятидевятимиллиметровый") & ! вернёт значение 46
len("") & ! вернёт значение 0
MSECSCOUNT
`MSECSCOUNT` — возвращает количество миллисекунд, прошедших с момента начала игры. Данная функция при использовании на локации-счётчике позволяет организовывать различные события, происходящие в реальном времени. Так же, с помощью этой функции можно делать замеры быстродействия различных участков кода в вашей игре:
old_time=msecscount
:for
if i<100000:
a[i]=i
i+=1
jump 'for'
end
new_time=msecscount
pl new_time-old_time
RAND
`RAND` — возвращает случайное число между двумя указанными числами. Общая запись:
, где `[#выражение 1]` и `[#выражение 2]` — два любых числа или числовых выражения. Параметр `[#выражение 2]` может отсутствовать, при этом он принимается равным нулю (в более новых версиях плеера, например Quest Navigator, данный параметр по умолчанию равен единице).
Примеры:
rand(4,1) &! вернёт случайное значение от 1 до 4
rand(1000) &! вернёт случайное значение от 0(1) до 1000
rand 1000 &! вернёт случайное значение от 0(1) до 1000
RGB
`RGB` — возвращает числовой код цвета на основе трёх числовых аргумнтов, каждый из которых соответствует составляющей требуемого цвета. Общая запись:
, где `[#красный]`,`[#зелёный]` и `[#синий]` — числовое выражение трёх составляющих цвета соответсвенно красной, зелёной и синей; должны принимать значения от 0 до 255.
Данная функция обычно используется совместно с системными переменными `bcolor`, `fcolor`, `lcolor`. Пример:
lcolor=rgb(255,255,100)
! фон тёмно-серого цвета
bcolor=rgb(25,25,25)
! текст светло-зелёного цвета
fcolor=rgb(100,255,100)
RND
`RND` - возвращает случайное значение от 1 до 1000. Аналогично команде:
STRCOMP
`STRCOMP` — проводит сравнение строки с регулярным выражением и, если строка соответствует регулярному выражению, возвращает -1 (истина), а если не соответствует — 0 (ложь). Общая запись:
, где `[$строка]` — любое текстовое значение, `[$шаблон]` — регулярное выражение, с которым производится сравнение.
Например, нам нужно проверить, состоит ли указанная строка из трёх слов. Каждое слово, в грубом виде, это набор непробельных символов, значит мы можем воспользоваться метасимволом `\S` и квантификатором `+`. Слова обычно разделены пробельными символами, для чего мы используем метасимвол `\s`. Получается вот такое регулярное выражение:
Теперь мы можем проверить, какие строки соответствуют этому регулярному выражению:
strcomp(' иду домой','\s?\S+\s+\S+\s+\S+\s?') & ! вернёт 0
strcomp(' иду в лес ','\s?\S+\s+\S+\s+\S+\s?') & ! вернёт -1
strcomp('однословие','\s?\S+\s+\S+\s+\S+\s?') & ! вернёт 0
STRPOS
`STRPOS` — возвращает позицию символа, с которого начинается вхождение подстроки, соответствующей регулярному выражению, в указанную строку. Общая запись:
, где `[$строка]` — исходная строка, в которой производим поиск вхождения, соответствующего регулярному выражению `[$шаблон]`, или группе номер `[#номер]` в регулярном выражении. Нумерация групп в регулярном выражении начинается с 1. Если подстрока с указанным номером отсутствует, то возвращается 0.
Если параметр `[#номер]` отсутствует или равен 0, то возвращается позиция символа, с которого начинается вхождение подстроки, соответствующей всему регулярному выражению.
Например, нам нужно выяснить, в какой части текста встречается словосочетание "зелёное яблоко", однако при этом не должно быть важно, в каком падеже записано это прилагательное.
Чтобы написать регулярное выражение для этой задачи, нам нужно предусмотреть все падежи:
зелёного яблока
зелёному яблоку
зелёное яблоко
зелёным яблоком
зелёном яблоке
Как видим, во всех формах меняются только окончания слов. Поэтому мы можем составить вот такое регулярное выражение:
Через прямую черту в скобках перечисленны возможные варианты окончаний. А теперь выясним, с какого символа в строке начинается возможное слвовосочетание "зелёное яблоко":
$regexp="зелён(ое|ого|ому|ым|ом)\s+яблок(о|а|у|ом|е)"
strpos("У меня есть зелёное яблоко",$regexp) & ! вернёт 13
strpos("Ты швырнул в него зелёным яблоком!",$regexp) & ! вернёт 19
strpos("полный ящик зелёных яблок",$regexp) & ! вернёт 0, потому что такую форму мы не учли
Если мы не просто хотим узнать, с какого символа начинается вхождение в строку словосочетания, но где начинается вхождение слово "яблоко" из этого словосочетания, нам нужно выделить слово "яблоко" с вариантами окончаний в отдельную группу и воспользоваться параметром `[#номер]`:
strpos("У меня есть зелёное яблоко",$regexp,2) & ! вернёт 21
strpos("Ты швырнул в него зелёным яблоком!",$regexp,2) & ! вернёт 27
strpos("полный ящик зелёных яблок",$regexp,2) & ! вернёт 0, потому что мы не учли форму
VAL
`VAL` — переводит указанную строку цифр в соответствующее число. Общая запись:
, где `[$выражение]` — любая строка текста.
При проверке учитываются знак `-` в начале, прилегающие пробелы и символы табуляции, но кроме того, если хотя бы один символ окажется не цифрой, функция вернёт 0. Так же если `[$выражение]` равно `''` (пустая строка), то возвращается 0.
Пример: