Тестване на палиндроми – част 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. Точно каквото искахме.
В трета част ще разгледаме няколко начина за проверка дали опростеният текст е еднакъв в права и обратна посока.
[…] втора част на урока намерихме най-добрия начин за премахване на всички […]