Глаза страшат, а руки делают

ШАГ 6


  • Виды условий и их запись
  • Регулярные выражения

ВИДЫ УСЛОВИЙ И ИХ ЗАПИСЬ

Раз уж нам пришлось в условии задать два значения на выбор с помощью оператора «или», пришло время рассказать и о других подобных операторах. Они используются только в условных конструкциях, но не в директивах. Их немного. Вот они:

Оператор

Описание

=

Равно (сдвоенный символ появился в спецификации XSSI; я пробовал и то, и друое на трёх серверах — работают оба)

==

!=

Не равно

<

Меньше

<=

Меньше или равно

>

Больше

>=

Больше или равно

!

Отрицание

&&

Логическое И

||

Логическое ИЛИ

Например, употребляя вместо равенства (=) неравенство (!=), наш код меню можно «перевернуть»:

<!--#if expr = "$QUERY_STRING='' || $QUERY_STRING != page1" -->
<td><div class="txtmenu"><a href="index.html?page1" class="lnkmenu">Главная</a></div></td>
<!--#else -->
<td><div class="txtmenu">Главная</div></td>
<!--#endif -->

Здесь мы использовали операторы как соответствие или несоответствие строке, но можно использовать их и в арифметическом смысле.

Например, в скрипт форматирования даты можно добавить такую «фишку»: выводить «воскресенье» красным цветом. В DATE_LOCAL воскресенье — «нулевой» день. В нашем скрипте номера содержатся в переменной numday. Сделаем в выводящий код маленькую добавку:

<p><b>Сегодня
<!--#if expr = "$numday = 0" -->
<span style="color:red;"><!--#echo var = "day" --></span>,
<!--#else -->
<!--#echo var = "day" -->
,
<!--#endif -->
<!--#echo var = "date" --> <!--#echo var = "month" --> <!--#echo var = "year" -->
года.</b></p>

А можно «перевернуть», использовав сравнительный оператор «больше» (>):

<p><b>Сегодня
<!--#if expr = "$numday > 0" -->
<!--#echo var = "day" -->
,
<!--#else -->
<span style="color:red;"><!--#echo var = "day" --></span>,
<!--#endif -->
<!--#echo var = "date" --> <!--#echo var = "month" --> <!--#echo var = "year" -->
года.</b></p>

Сегодня четверг, 14 ноября 2019 года (заходите в воскресенье и посмотрите).

РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ

Неоднократно упоминается, что в условном операторе SSI можно использовать регулярные выражения. Однако об их синтаксе ничего конкретного не сказано, только упоминается, что он аналогичен синтаксису регулярных выражений в Unix-команде egrep (забегая вперёд, скажу, что далеко не всё из этого синтаксиса поддерживает SSI).

В общем, приходится заниматься научно-исследовательской и экспериментаторской деятельностью. Опишу то, что «нарыл». Может быть, что-то к этому добавится.

Но, возможно, многим из вас нужен маленький «ликбез»…

Регулярные выражения это набор специальных символьных конструкций-шаблонов, которые замещают определённый символ, набор символов или фрагмент текста. Когда в поиске Windows нам надо найти, скажем, все файлы .mp3, которые есть на компьютере, мы набираем в строке поиска *.mp3. «Звёздочка» — это регулярное выражение.

Обычно регулярные выражения используются как для поиска, так и для замены. В SSI возможен только поиск. Потому что их можно использовать только в условии условного оператора. А сохранить их в переменной уже не получится.

Все регулярные выражения в SSI помещаются между слэшами:

/выражение/

Вот перечень регулярных выражений SSI, которые мне удалось протестировать методом «тыка»:

/строка/

Подстрока (фрагмент большей строки).
Например, /index/ при анализе строк
http://froland.ru/index.html и http://froland.ru/samodel/index.html
в обоих случаях возвратит истину

/^строка/

Подстрока в начале строки.
Например, /^html/ при анализе строки
htmlbook.ru/index.html
возвратит истину, распознав первые 4 символа

/строка$/

Подстрока в конце строки.
Например, /html$/ при анализе строки
htmlbook.ru/index.html
возвратит истину, распознав последние 4 символа

/[строка]/

Любая комбинация символов, присутствующих в исходной строке.
Например, /[кто]/, /[так]/ или /[сто]/ при анализе строки
строка
возвратит истину, а /[сыр]/ — ложь (из-за буквы «ы»)

/*/

Любые символы. Что бы ни нашли, всё подойдёт.

/ст.*.ка/

Если мы ищем любые символы во фрагменте строки, то этот фрагмент «свободного поиска» должен быть отделён точками.
Выражение /та.*.ка/ будет истинным для строк
тачка,
таранька,
таблетка.
А вот такая конструкция
/*...*/
возвратит истину для любой строки с точкой (например, index.html). Средняя точка — это точка в исходной строке, остальные — разделители.

/строка+/

Поиск повтора символа. Например, /е+/ возвратит истину для слов
реестр,
феерия

Пока хватит. Всё, что раскопаю ещё, буду помещать на соответствующую страницу справочника.

Добавлю только, что регулярные выражения можно комбинировать в одном условии. Например, так (комбинируем «свободную зону» и «конец слова»):

/ст.*.ка$/

Это возвратит истину для слов «строка», «стопка», «стамеска». Но если мы уберём «бакс», показывающий конец слова, то к ним прибавятся «стакан», «стукач», «старикан», «стаккато» и т.д.

И ещё (об этом я уже упоминал во 2 шаге): если в искомой строке есть слэш (/), его надо заэкранировать обратным слэшем: \/.

Как экранировать другие спецсимволы, я пока не понял. Экспериментировал со звёздочкой, но \* выдаёт истину и для строки ***, и для всех других.

Учтите также, что строкой, в которой мы производим поиск, может быть не только одно-два слова, но и большой текст.


Пока всё


 001835