RU 📌 Pinned

Как сделать?

Dark[Ol(U23)leneri] #34 18.04.2010 22:57 6408 comments 2436950 views

Нужна помощь с regexp’ами. Дело в том… …что я тупо не понимаю, как их использовать!

Примеров по их юзанию в коде нигде нет (или я их не нашёл), поэтому всё пробовал методом проб и ошибок. Создаётся ощущение, что интерпретатор QSP просто не воспринимает регекспы как часть кода, для него это только ошибки синтаксиса. Испытал всё - заключал в фигурные скобки, в кавычки, в ’ и ’, словом сделал всё, что только мог. Толку - 0. Подаю сигнал SOS и жду помощи. Если не утону к чертям в ближайшее время.

С уважением,
N_A

Aleks Versus Moderator 30.09.2017 09:23 (8 years ago)

ДоБрЫй_МеДвЕдЬ,
Регэкспы используются с функциями $strfind, strcomp, arrcomp, strpos. В старой справке об этом говорится, в новой (сейчас посмотрел) нет перекрёстных ссылок между разделами. Собственно всё просто, но понимание приходит с опытом.
Показываю, как пользуюсь я.

Spoiler

Есть текст:

ДоБрЫй_МеДвЕдЬ:

Примеров по их юзанию в коде нигде нет (или я их не нашёл), поэтому всё пробовал методом проб и ошибок. Создаётся ощущение, что интерпретатор QSP просто не воспринимает регекспы как часть кода, для него это только ошибки синтаксиса. Испытал всё - заключал в фигурные скобки, в кавычки, в ’ и ’, словом сделал всё, что только мог. Толку - 0. Подаю сигнал SOS и жду помощи. Если не утону к чертям в ближайшее время.

нужно найти в нём слово из трёх букв.
Смотрим справку:

Справка:

\b - граница слова
\w - буква или цифра или символ подчёркивания

Пишем код:

! помещаем текст в переменную для удобства
$text="Примеров по их юзанию в коде нигде нет (или я их не нашёл), поэтому всё пробовал методом проб и ошибок. Создаётся ощущение, что интерпретатор QSP просто не воспринимает регекспы как часть кода, для него это только ошибки синтаксиса. Испытал всё - заключал в фигурные скобки, в кавычки, в ' и ', словом сделал всё, что только мог. Толку - 0. Подаю сигнал SOS и жду помощи. Если не утону к чертям в ближайшее время. "
! ищем слово из трёх букв с помощью strfind
$strfind($text,'\b\w\w\w\b')

В тексте будет найдено первое вхождение, соответствующее этому регэкспу, то есть слово “нет”.
Регэксп можно изменить. Во-первых, не обязательно писать \w\w\w — есть специальный квантификатор. Он позволяет указать число повторяющихся символов или групп (вхождений):

Справка:

** — n вхождений

Теперь регэксп выглядит так:
\b*\w*\b
используем:

$strfind($text,'\b\w{3}\b')

Или мы хотим найти слово из трёх букв, но чтобы второй символ не был буквой “е”. Тут справка нас немного запутает:

Справка:

[] — Класс символа

вот тут кусочек более понятный:

Справка:

Для описания таких подмножеств применяются символы квадратных скобок “[” и “]”. Квадратные скобки, встреченные внутри регулярного выражения считаются одним символом, который может принимать значения, перечисленные внутри этих скобок.

и ещё:

Справка:

Символ “^”. Если этот символ стоит первым в секции задания подмножества символов (и только в этом случае!) он будет рассматриваться как символ отрицания.

Таким образом, чтобы найти слово из трёх символов, второй из которых, не “e”, можно составить такое регулярное выражение:
\b\w[^е]\w\b
Используем:

$strfind($text,'\b\w[^е]\w\b')

Так мы найдём слово “или”.
Вообще, с помощью метасимвола \w мы указывали, что нас устроит в слове или буква или цифра или символ подчёркивания, но что если у нас в тексте есть такие сочетания 1_г и мы не хотим их находить? С помощью тех же квадратных скобок можно указать наборы символов, среди которых нужно производить поиск:
\b[А-Яа-я]\b
Используем новые знания:

! найдёт слово "нет"
$strfind($text,'\b[А-Яа-я]{3}\b')
! найдёт слово "или"
$strfind($text,'\b[А-Яа-я][A-Да-дЖ-Яж-я][А-Яа-я]\b')
! исключил букву "ё" потому что маленькая "ё" приводит к ошибке компиляции регэкспа у меня

Ну а для более широкого понимания, как составлять регэкспы, нужно копать интернет.

Большое спасибо, Aleks! Вы не представляете, как я вам благодарен. :)

Отличный текст! Его хоть сейчас в документацию )

Aleks Versus Moderator 02.10.2017 21:12 (8 years ago)

Nex,
да, я может в скором времени соберусь, добавлю в более развёрнутом виде на вики.

Всем привет! Такой вопрос - есть ли какой-нибудь способ сделать нормальный и красивый фон в классике? $BACKIMAGE как-то слишком убого получается.

Нету )

Снова обращаюсь к форуму за советом.
Надеюсь, ещё не не задолбал…

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

В классике - нельзя. Но можно положить шрифт в папку с игрой и попросить пользователя его установить )

В Навигаторе - можно через CSS.

Всем доброго времени суток. Есть идея: сделать отображение параметров персонажа в отдельном окне(через msg), окно открываться должно ссылкой из дополнительного окна описаний. Перепробовал уже массу вариантов, но ничего не получается Т_Т

Можете ли подсказать как сделать чтобы часы (время в игре) перемещались в каждой локации.
Ну то есть в одной локации 14:00,переместился в другую локацию там уже 14:10,но при этом оператор на время во второй локации писать не нужно

Можете ли подсказать как сделать чтобы часы (время в игре) перемещались в каждой локации.
Ну то есть в одной локации 14:00,переместился в другую локацию там уже 14:10,но при этом оператор на время во второй локации писать не нужно

Серый Кардинал,
чтобы на второй локации не писать, прибавляй время на первой перед переходом.

ACT 'Идти в школу'
    время = время + 10
    GOTO 'Школа'
END

Ну а в целом время с примерами смотри здесь - Игровое время

Nex,спасибо

Друзья! Я пока новичок в qsp. Делаю потихоньку свой проект, и у меня такая проблема: не могу найти хороший вариант реализации диалогов. Может кто-то что-то подскажет? Про пример с Арагорном я знаю, но он мне не подходит из-за того, что у меня в диалогах прописаны описания каких-то действий героев. Выкинув их, как мне кажется, игра потеряет долю описания, и, как следствие, атмосферы. Заранее благодарю всех. :)

Log in or Register to post comments.