Професионална програма
Loading...
+ Нов въпрос
Tr00peR avatar Tr00peR 566 Точки

[Homework] PHP Basics - Arrays, Strings, Objects

Здравейте колеги, това са моите решения от домашното за масиви, стрингове и обекти.

Моля за коментари и препоръки, най-вече за качеството на кода.

  1. 01 - Word Mapper
  2. 02 - Link Colorer
  3. 03 - Sidebar Builder
  4. 04 - Text Filter
  5. 05 - Sentence Extractor
  6. 06 - URL Replacer
  7. 07 - To Do
13
PHP Web Development Basics
Ivaylo.Il avatar Ivaylo.Il 226 Точки

Нещо не мога да разбера какво упражняваме с 3та задача свързано с лекцията. На 1ва цепя с патерн, на 2ра упражняваме, чарове от аски таблицата, но 3та изглежда, че извличаме информация от 3 масива и я принтим в хтмл тагове. Правилно ли рабирам или се бъркам?

2
iordan_93 avatar iordan_93 Trainer 407 Точки

Упражняваме split (който може да е и с pattern за повече гъвкавост), упражняваме масиви и string-ове. Това са две от трите неща в заглавието на лекцията.

1
21/08/2014 19:53:49
Ivaylo.Il avatar Ivaylo.Il 226 Точки

ем и ти си прав, но тези неща ги упражнявахме и в предишни домашни ... както и да е.

Просто като я видях за 1ви път реших, че с решението, което ми хрумна не упражняваме нищо ниво и е един вид workaround, но явно така трябва да бъде.

2
21/08/2014 20:02:27
iordan_93 avatar iordan_93 Trainer 407 Точки

Здравейте,

Поствам и моите решения с очакване за bugfixes и критика :)

1. Word Mapping - използвам функцията array_count_values() (въпреки че много обичам да си броя стойностите сам, без нея laughing)
2. Coloring Texts - това, което може да създаде проблем тук е правилното вземане на номера на character-a. Трябва да се използва multibyte string и тъй като няма готова функция за целта, чичко Гугъл върши добра работа
3. Sidebar Builder - straightforward, четем POST-натите данни, split-ваме и пълним в HTML елементи това, което сме намерили
4. Text Filter - с preg_replace_callback() заменям всеки string с нов string със същата дължина. Моят callback може да се напише и на един ред (така може да се извика preg_replace()), но става малко трудно за четене
5. Sentence Extractor - най-интересното тук е, че много добра работа върши т. нар. negative lookup - /(?<=)/ за регулярни изрази. Малко ми взе здравето, докато го уцеля как точно се пише, но мисля, че работи
6. URL Replacer - опитал съм се да хвана възможно най-много случаи за отварящия таг с регулярния израз
7. SoftUni Seminar Generator - две неща ми харесват основно тук. Първото е, че щом разчитаме, че входът ни е коректен, можем с един регулярен израз да си вземем всичко, което ни трябва от него. Разбира се, регулярният израз е доста грозен на пръв поглед, но върши работа.

Второто е, че обектите може да се сортират по много интересен начин. Ако приемем, че функцията за сортиране връща само -1 или 1 (което ще рече, че равните елементи се подреждат в какъв да е ред - подходящо за случая - не бихме могли да имаме два семинара по едно и също време, или с едно и също име), можем да си я генерираме динамично. Това правя в статичния метод Seminar::orderBy. След поредица от рефакторирания, мисля, че това е едно от най-красивите парчета код, които съм писал laughing:

return function ($first, $second) use ($property, $order) {
    return ($order == "ascending" ^ $first->$property < $second->$property) ? 1 : -1;
};

Това ще рече, че след като вече аргументите са минали валидация, функцията връща функция (парадигма от функционалното програмиране, нарича се функция от по-висок ред, higher-order function), която сравнява обектите. Заради валидирането, $order може да е само ascending или descending. И така, сортирането връща -1 или 1 в зависимост от това в каква посока е сортирането и каква е подредбата на property-тата (това са променливите в класа). Друго интересно нещо - извиква се динамично $first->$property (което runtime става примерно $first->name) - едно от големите предимства на скриптовите езици. И третото интересно нещо е, че двете условия (стойността на $order и подредбата на елементите) са свързани. Това позволява доста елегантно, с XOR и само един тернарен оператор да върна стойността, която ми трябва.

13
23/08/2014 00:15:10
borislavml avatar borislavml 368 Точки

Колега , и аз реших 4-та задача с preg_replace(), а не str_replace(), с идеята да го упражня, но всъщност забелязах, че в случая няма никакво значение кое от двете ще се ползва. Имам в предвит, че и двете  функции, ако да речем в текста имаш не "Windоws" и "Linux", a "Windowssssss" и "Linuxxxxx" ще ти мачнат windows и linux и ще го заместят и ще стане "*******ssssssss" и "*****xxxxxx".  Това ми направи впчетление, и се замислих какво всъщност се иска по условие в задачата! Да заместим всяко Windows в текса, или само на тези места, където се появява като самостоятелна дума? Ако случаят е втория тогава ползването на preg_replace(), наистна придобива някакъ смисъл, зашото можем да направим pattern-a да мачва само самостоятелните появи на думата, в случая с твоя код като заместим patterna:  '/' . $bannedWord . '/' с  '/\b' . $bannedWord . '\b/;  Тогава Windowssss ще си остане Windowssss, a няма д стане *******ssssssss. 

Като цяло първия вариант ми се струва по-логичен(да замества всичко срещнато), но втория е доста по-интересен и няма да се учудя, ако ни "закопаят" точно с такъв случай на изпита. Интересно ми е какво мислят и останалите smile. Поздрави и евала за светкавично решените задачи, включително и 7-ма. Как успяваш ?smile

 

1
iordan_93 avatar iordan_93 Trainer 407 Точки

Това с match-ването е доста голям проблем на цензуриращите системи. Въпросът е по-скоро концептуален. Така или иначе промяната в кода е малка. Според мен всеки един substring трябва да се цензурира, според други може да е друго. Все пак в Windowss има Windows. В somethingWindowssomething също има.

Иначе съм използвал preg_replace(), защото не разбрах дали str_replace() маха празните елементи.

Една супер добра система ще намира подобни думи (примерно с наставки -s, -ing, -ve, представки pre-, em-, en-... и т. н.) и ще маха и тях. Да, но първо да направиш такава система правиш изкуствен интелект laughing и второ, колкото и добре да я направиш, като тръгнеш да разпознаваш езици става страшно.

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

P. S.: Още не съм довършил 7-ма :D

P. P. S.: Една друга идея - може да търсим думата като substring и да цензурираме цялата дума (включително с къси тирета (Wind-owss) и апострофи (Window'ss, Windowss').

0
21/08/2014 23:53:45
BoniMislyashki avatar BoniMislyashki 36 Точки

На 5та задача е добре да се разгледат и още два случая, когато думата е в началото на изречението (макар че в условието не е споменато нищо за case-sensitive) и в края. За втория вариант може да се напише preg_match('/\s+' . $_POST["word"] . '\s*.*[.?!]/', $sentence) - т.е. използваме s*(вместо s+), за да се хванат 0 или повече уайтспейси след думата.

0
Valleri avatar Valleri 302 Точки

Здравейте,
ето една седма задача от мен, след около 4 часа занимавка :)
Solution

Р
еших да го направя с класове, макар че можеше да направя таблицата под формата на стринг и да я принтирам. Имах доста затруднения около SESSION и POST. Но поне научих, че с POST няма как да прехвърля данните към другата страница, или има? Друго, което ме забави е изкачащото поленце с информация. 
Опитах се да направя templating по тази статия Templating, но не знам дали се е получило. 
Желая критики yell

0
22/08/2014 14:29:42
Samuil.Petrow avatar Samuil.Petrow 1548 Точки

"Но поне научих, че с POST няма как да прехвърля данните към другата страница, или има?"

Оказваш на формата action="file.php" и това ще прати данните в посочената страница :)

0
Valleri avatar Valleri 302 Точки

Направих същото, но по някаква причина не ми пращаше, може и да не е това....Ще пробвам отново.

0
Ivaylo.Il avatar Ivaylo.Il 226 Точки

5та задача не трябва ли да връща 3 изречения? 

This is my cat!

And this is my dog.

Well it is :) 

или да разбирам, че е задължително изречението да завършва на ! ? . 

 

Ето и моите решения -- ТУК;

 

Моля за коментари по последните 2 задачи, дали са правилни т.е. ако бяха на изпит дали щяха да минат проверките :/ .

0
22/08/2014 17:46:52
Tr00peR avatar Tr00peR 566 Точки

От условието на 5та задача: A sentence is any sequence of words ending with ., ! or ?.

 

Аз поне го разбирам, че ако не завършва на един от тези три знака, значи не е изречение :)

1
borislavml avatar borislavml 368 Точки

Един комплект и от мен. GitHub  Много интересно домашно, най-накрая смея да кажа понаучих регулярните изрази smile

2
a.manov avatar a.manov 2 Точки

Колега, гледам си ползвал $pattern = '/(?<=[.?!])\s+/';

на пета задача. Някоя ще обясни ли какво точно и как го прави този pattern. Предполагам разделя текста на изречения, ама какво точно прави всяка част от него, например ?<=

Thank you

0
borislavml avatar borislavml 368 Точки

Здравей, понеже искаме да сплитнем текста на изречения, не можем да ползваме за разделител само whitespace(\s+),защото така ще ни сплитне всяка дума. Нужен ни е израз, който да казва сплитни по whitespace непосредствено предхождан от !, ? или .(точка). Така фактически намираме края на всяко изречение. изразът ?<= казава фактичеки whitespace(\s+) задължително предхождан от !, ? или .(точка).[!?.] и е нужно цялто това нещо да го затворим в група () и се получава (?<=[.?!]). Доста е замотано ще се опитам да ти дам пример ако израза ни е
(?<=foo)bar това ще казва намери всикчи bar които обаче задължително за предхождани от foo. Това ще намри единствено и само foobar и няма да намери foabar, faobar и така нататък. В нашия случай намиране всички (! ),
(. ) и (? ). Надявам се, че успях поне малко да обясня. Ето една много полезна статия за така наречения Lookahead and Lookbehind http://www.rexegg.com/regex-lookarounds.html

1
28/08/2014 17:43:37
a.manov avatar a.manov 2 Точки

Да, много добре обясни, мерси. Направо ставай лектор ;)

0
ZvetanIG avatar ZvetanIG 907 Точки

Още решения и от мен.  => ТУК

Регулярните изрази са много силен инструмент и е хубаво, че все повече колеги почват да ги разбират!

Ще си позволя един съвет. Когато използвате регулярни изрази, направете така, че да ви свършат максимално от работата.

Пожелавам на всички успех на изпита!

7
24/08/2014 13:02:58
HPetrov avatar HPetrov 822 Точки

На 6-та задача placeholder-ите ти трябва да са с доларче отпред :) [URL=$1]$2[/URL] Ако е с "\" пред цифрите не сработват, или поне при мен не искат.

P.S. Ти си моето Regex гуру. Само от твоите pattern-и намирам смисъл и разбирам нещо :D

2
24/08/2014 15:24:19
ZvetanIG avatar ZvetanIG 907 Точки

Мерси много, просто следвах лекцията.

P.S.  Чак пък гуру.smileembarassed

0
externo avatar externo 119 Точки

Това е единственото решение от показаните на 6 задача което не разпознава <a>NO url</a> като валиден URL.

БРАВО!!!

Правилно ли съм разбрал мачването:

'/<a href=[\'\"] -  отваря тага, атрибута и кавичките

([^<>]+) - това очевидно е линка, ВЪПРОСА е: защо ползваш ^<> за какъвто и да е текст?

 [\'\"]“ - това затваря кавичките и тага

([^<>]+) - това очевидно е съдържанието на тага, същия въпрос

<\/a>/i' - затваря тага и игнорва височината на буквите

Другият ВЪПРОС е как се хващат плейсхолдърите, само с двойни скоби ( ) ли ги разпознава като такива?

0
26/08/2014 18:25:54
alek1339 avatar alek1339 57 Точки

може ли малко помощ, извинявам се предварително, че поствам кода директно тук: 

if($temp % 2 == 0){
$temp = chr($temp);
echo "<span class='red'> $temp </span>";
}
else{
$temp = chr($temp);
echo "<span class='blue'> $temp </span>";
}
?>

някой вижда ли къде ми е грешката, защото първия символ винаги ми го слага на един ред а всички останали на долния...

0
kisyova avatar kisyova 13 Точки

 

Опитай със следното:

if(ord($temp) % 2 == 0) {
echo "<span class=\"red\">$temp</span>";
}
else {
echo "<span class=\"blue\">$temp</span>";
}

0
alek1339 avatar alek1339 57 Точки
пак по същия начин се получава...
0
Tr00peR avatar Tr00peR 566 Точки

Колега, така като даваш само част от кода, трудно някой може да ти помогне.

1
Dzhuliya avatar Dzhuliya 5 Точки

Колеги, искам да Ви попитам, как се справяте с тест на word - "This" (става въпрос за задача 5 - Sentence Extractor) ? Защото и на мен регулярният израз за търсене на дума е да ми започва и завършва със спейс. Обаче така не ми хваща првата дума от изреченията, защото нали има орязвам white space-овете. Дори и да не ги trim-вам предварително, пак няма да ми хване първата дума от текста. Някакви предложения?

0
27/08/2014 18:06:34
Tr00peR avatar Tr00peR 566 Точки

Вместо спейсове може да се сложи \b -> word boundary, и така ще ти хване This :)

1
StanDimitroff avatar StanDimitroff 90 Точки

Интересното е, че до момента само решението на  ZvetanIG  на задача 5 работи за Isn't / isn't. Ако обаче се пейстне директно текста, копиран от условието не го хваща заради различния апостроф :)

0