Колко са важни те? Отговорът е ясен - много. В повечето случаи вземате информация от потребителя, било то форма за запитване, някаква регистрация или просто мнение в анкета. Както споменах преди, текстът се представя като символен низ, т.е. масив от последователни символи. В РНР променливите ви могат да са от тип символен низ, но това не значи, че вие имате достъп до тях като масив. Вие ги обработвате като обикновенна променлива с допълнителни операции. Ето най съществената:
$ERRS = "The file".$file."cannot be opened!";
С точка всъщност обозначаваме добавяне или долепване. Това е удобна операция, която ще ползваме доста често. Следващото с което ще ви запозная, може би малко необичайно, е функция, с която можем да представим стринг в масив:
implode("разделител", "текст", лимит);
Разделителя е символът, спрямо който ще се раздели текста, а лимит е най-големия брой разделяния. След достигането им, останалия текст се записва в посления елемент от масива. Нека разгледаме следния пример:
$pizza = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2
echo $pieces[6]; // piece6
Тук в стринга $pizza думите са с отстояние един интервал. Ето защо ние ги разделяме с explode на интервали, като получаваме масив $pieces с отделните думи. Ако да кажем ни интересуват само първите 2 парчета, поставяме лимит 2. Така ще имаме масив с 3 елемента - две думи и един низ от останалите думи. Ако по някаква причина ни трябва да използваме стринга като масив от символи(думите пак са низ от символи), ще използваме разделител празния символ, т.е. "". Така ще разделим всеки символ от предишния.
Както подсказва и името на функцията, трябва да има и обратна тя е implode. Синтаксисът й е същият, единствената разлика е, че няма лимит. Тя превръща масив в стринг, като отделните елементи са разделени с "разделител"(първия параметър на функцията).
Преминаваме нататък и достигаме до trim(). Тя премахва интервалите, новите редове, табулациите и символа за край(о) от даден стринг. Ето как да я използваме:
$all = trim($pizza);
/* "piece1piece2piece3piece4piece5piece6" */
Друга много по-често използвана функция е nl2br. Когато извеждате нещо към браузера, то се интерпретира във HTML формат. Както ви е известно, за него новите редове се обозначават с "<br \>"("<br>" за версии, по стари от 4.05). Когато извеждате дълъг текст към браузера може да замените всеки нов ред с "
". Това и прави тази функция:
$feedback = nl2br($feedback);
echo $feedback;
За самостоятелно запознаване оставям функцията printf(). Тя е взаимствана 100% от езика С и е полезна при извеждане на текст за печат например. Тъй като в повечето случаи тя не е нужна преминавам към следващите 4 функции:
$string = srttolower($string);
//преобразува целия низ с малки букви
$string = srttoupper($string);
//преобразува целия низ с главни букви
$string = ucfirst($string);
//преобразува само първата буква от низа е главна,а другите са малки
$string = ucwords($string);
//преобразува всяка дума започва с главна буква, а другите са малки
Преминавам към две много прости и същевременно много важни функции: AddSlashes() и StripSlashes(). Когато ви трябва кавичка в стринг, тя не трябва да се интерпретира като кавичка в базата данни например, защото там тя изпълнява друга функция. За да укажете това преди нея трябва да има наклонена черта: \" . По същия начин, ако ви трябва самата наклонена черта, за да не се интерпретира ползвате \\. Добавянето на такива черти става с първата функция, а премахването на тези символи - с втората. Това е особено важно, тъй като ако приемате от потребителя текст, някъде той може да ползва кавички и това да доведе до грешка в базата данни. От друга страна, ако потребителя има лоши намерения, той може да въведе текст, който да причини щети. Малко е рано да ви показвам такъв пример, но след запознаване с MySQL, ще има статия, изцяло посветена на сигурността на кода. Давам пример:
$text = $_POST('text'); // грешка
/* възмжен резултат: `Момичето си взе " кошничката "` */
$text = AddSlashes($_POST('text')); // вярно
/* `Момичето си взе \" кошничката \"` */
Нека разгледаме още няколко полезни функции. Да кажем искате да изведете стринга без първите две букви. Тогава използвате:
substr("стринг", начало на премахването, дължина);
Пример:
substr("Your customer service is excellent", 0, 4); // връща "Your"
Ако искате да започва от края ползвате отрицателни стойности:
substr("Your customer service is excellent", -9); // връща "excellent"
Ако се налага да сравните два стринга за съвпадение ползвате:
strcmp($string1, $string2);
Тази функция различава главни от малки букви, т.е. "Да" е различно от "да". Ако искате това да не е така ползвайте strcasecmp(), която е със същия синтаксис. Ако се налага да разберете колко символа има в даден низ, ползвате strlen($string); Тя ще ви върне дължината на низа. Ако искате да проверите дали един низ се съдържа в друг ползвайте:
strstr($началенСтринг, $търсенСтринг);
Върнатият резултат ще е началенСтринг от мястото, където се среща за първи път търсенСтринг при успех, а ако няма съвпадения, ще върне лъжа. strpos() има почти същия синтаксис, като strstr, но връща не самия стринг, а позицията на първата поява(число). Има още една доста важна и много често използвана функция:
str_replace($търсенНиз,$заместванНиз, $Стринг);
Тази функция ще замести търсенНиз със заместванНиз от Стринг и ще върне резултатът. По-нататък ще ползваме тази функция при създаването на темплейт система. Както обикновенно препоръчвам да не четете все още тази статия, тъй като в нея има работа с файлове, а това все още не е обсъждано.
Преминаваме към част 2 на този урок, която е и по сложна - регулярни изрази. Тъй като в уеб програмирането често се налага сложни проверки за акуратност на информацията, са разработени две прототипни функции, с които може да правите сложна проверка и заместване в стринг. Тези функции са ereg(или eregi за неразличаване на големи от малки букви) и ereg_replace(или eregi_replace за неразличаване на големи от малки букви). Първо синтаксиса на ereg :
ereg($условия, $търсенСтринг);
Преди да дам пример, ще трябва да дам някои обяснения за тези условия. В тях може не само да търсите за точно съвпадение, както в strstr. Има редица командни символи, които указват различни условия. Трябва да се запознаем първо с тях и тогава със самата функция. Всъщност ние указваме прототип на стринга, който проверяваме дали е верен. За пример, ако трябва да проверите дали даден стринг е електронен адрес, ще трябва да ползвате редица функции и проверки, а с ereg това ще стане само с една операция. Нека започнем със символите:
Основни символи
^ - указва начало на стринг
$ - указва край на стринг
. - указва произволен символ
* - повторение 0 или повече пъти
+ - повторение 1 или повече пъти
| - логическо или за подстринг
\ - включва символа, след този, без да го интерпретира. (пример: за да позволите " в стринга пишете \")
- - указва разтояние, т.е. a-z са малките буквите от а до z
Класове символи(Групи)
[] - обозначава клас(група) от символи
{} - обозначава минимален и максимален брой символи в групата
() - повтаряща се група
За да внеса малко яснота давам примери:
com$
// ще означава стринг, последните 3 букви от който са com
.at
/* ще означава стринг, който е от 3 букви, поседните са at,
а първата е произволна, cat, nat, $at, #at */
[a-z] // стринг, само с малки букви
[a-zA-Z] // стринг само с букви
[a-zA-Z0-9] // стринг само с букви и числа
(com)|(net)|(org) // стринг с едно от изброените
(very )*large // едно от very large, very very large и т.н.
(very ){1,3} // едно от 'very ','very very ' и 'very very very '
Сега нека видим как ще стане проверка за валидността на електронна поща. Един имейл има следния синтаксис: ime@subdomеin.domеin.raz . Субдомейна може да не присъства, но може и да присъства. Когато започнете да правите проекти ще забележите, че въпреки честата нужда от такива валидатори, много от тях не са добре направени. Често разширението се ограничава така {2,3} , тоест между 2 и 3 символа. eAdvise за пример е с разширение info, което е очевидно с 4 букви и валидатора няма да го възприеме като вярно. Важно е да запомните, че 50% приети невалидни имейли е много по-добре от 1% отхвърлени валидни имейли.
Първо, името на пощенската кутия може да бъде от букви, числа, точка, долна черта и тире, т.е. ще дефинираме първата ни група символи, обозначаващи името
[a-zA-Z0-9_\-\.]+
Т.е. приемаме поне един символ. Следва @ и субдомейна или домейна.
@[a-zA-Z0-9\-]+
Отново трябва да има поне един символ. Сега идва деликатната част. Може да следва или домейн, ако предишното е било субдомейн или разширение. Ще ги обединим в едно, като позволим точка и тире.
[a-zA-Z0-9\-\.]+
Важно е отново да е поне един символ. Тази проверка ще допуска доста невалидни имейли, но няма да отхвърля валидни, което е по-важно. При всички положения обаче, това е по-добре от проста проверка като strstr. Окончателно в РНР можем да проверим дали дадена променлива е имейл с:
eregi("^[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9\-]+[a-zA-Z0-9\-\.]+$",$email);
Окончателният вариант изглежда малко странен на пръв поглед - за повечето хора това изглежда пълна безсмислица, но за запознатия читател това е проверка с регулярни изрази. Самите проверки не се правят често, но заместванията са чести, поради лесната си употреба с eregi_replace. Синтаксисът е същият като на str_replace, единствената разлика е че търсеният стринг е регулярна проверка, т.е. командните символи от ereg се вземат в предвид.
Последното може да ви се струва малко сложно за разбиране и запомняне. Първоначално се опитайте да работите с другите функции, а проверката за имейл ползвайте на готово. Упражнете проверка на година след това с регулярни изрази или проверка на дата с формат дд:мм:гггг. Опитайте да подобрите проверката, без да допускате охвърляне на валидни имейли, като сложите ограничения за броя на символите(домейна и разширението не могат да бъдат по-малки от 2 символа).
До тук проследихме предимно код на РНР. Предпоагам това обърква малко или много, защото не сте видели нито един практически пример. На всеки 5 урока има едно обобщение, в което ще проверим наученото, с реални примери.