Тестване на палиндроми — част 2

В първа част на урока стигнахме до момент, в който премахваме точно определен списък със знаци.

Този подход обаче не е най-подходящия в нашия случай. Трудно можем да изброим точно какви знаци искаме да премахнем.

Като условие не казваме: “Игнорираме точка, запетая, интервал, тире, въпросителен знак, удивителен знак” и т.н. Казваме просто по човешки “специални знаци”.

Лесно разбираме, че всичко различно от букви можем просто да го пропуснем.

Има начин на компютрите да го кажем пак така, но не и с функцията str_replace, а с регулярни изрази.

Задълбочено учене на регулярни изрази в момента не е обект на наш интерес, тъй като е тема за по-напреднали, но нека разгледаме един доста опростен пример:

Прост регулярен израз

$test = 'If I Had a Hi-Fi';

$simplified = preg_replace('/\W/', '', $test);

echo $simplified;

preg_replace е функция, която прилича на str_replace. Разликата е, че първият аргумент не е string, а е регулярен израз.

Какво се регулярните изрази?

Регулярните ирази са гъвкав начин да опишем текст. Задължително в началото и в края трябва да имаме “разделител” (delimiter). Той трябва да е един и същ на двете места. Друго условие е да не се среща никъде другаде в регулярния израз.

По конвенция най-често се използва разделител “/”.

Escape-ване на разделителя

Ако все пак се налага да опишем текст, в който да се среща този разделител, можем да го escape-нем с наклонена черта. В URL адреси примерно трябва да escape-ваме много: /http:\/\/magadanski\.com\//.

Започвам с /, след това имам http:. По-нататък адресът на сайта ми би бил //magadanski.com/. Escape-вам // като пиша наклонена черта пред всяка: \/\/. Продължавам с magadanski, а пред точката пак поставям \, защото тя също има специално значение: \.com.

Понеже накрая имам / пиша \/.

Тъй като съм свършил с регулярния израз после пак трябва да изпиша разделителя: /.

Толкова много наклонени черти може да са доста объркващи при писане. А при четене на чужд код става почти невъзможно да се схване за какво става въпрос.

Други разделители

Затова често срещано е при работа с интернет адреси, вместо / за разделител при регулярните изрази да използваме # или ~.

Така "/http:\/\/magadanski\.com\//" се превръща в аналог на #http://magadanski\.com/# и ~http://magadanski\.com/~. Доста по-изчистено, нали?

Метазнаци

В примера по-горе съм използвал \W. Нарича се “метазнак” и означава “всичко без букви”.

В регулярните изрази главни и малки букви имат значение. Макар и \W да означава “всичко без букви”, ако го напишете с малко “w” става точно обратното: “само букви”.

Наклонената черта пред “W” и “w” в двата примера указва, че това е специален знак, а не просто буквата “W” или “w”.

Други метазнаци са: \d (цифри), \D (всичко без цифри), \s (whitspace — интервал, таб, нов ред и др), \S (всичко без whitespace).

Така preg_replace('/\W/', '', $test); връща string, където всичко, освен буквите, е заменено с празен string. Точно каквото искахме.

В трета част ще разгледаме няколко начина за проверка дали опростеният текст е еднакъв в права и обратна посока.

Един отговор за “Тестване на палиндроми — част 2”

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

Този сайт използва Akismet за намаляване на спама. Научете как се обработват данните ви за коментари.