Меню

Първи стъпки в правене на сайтове

Влез Излез

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

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

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

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

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

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

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

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

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

echo $simplified;

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

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

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

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

Започвам с "/", след това имам "http:". По-нататък адресът на сайта ми би бил "//magadanski.com/" и escape-вам "//" като пиша обратно наклонена черта пред всяка направо наклонена: "\/\/", продължавам с "magadanski", а пред точката пак поставям "\", защото тя също има специално значение и трябва да се escape-не, за да се има предвид като съвсем обикновена точка: "\.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. Точно каквото искахме.

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

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

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

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax