[Homework] PHP Basics - Arrays, Strings, Objects
Здравейте колеги, това са моите решения от домашното за масиви, стрингове и обекти.
Моля за коментари и препоръки, най-вече за качеството на кода.
Здравейте колеги, това са моите решения от домашното за масиви, стрингове и обекти.
Моля за коментари и препоръки, най-вече за качеството на кода.
Нещо не мога да разбера какво упражняваме с 3та задача свързано с лекцията. На 1ва цепя с патерн, на 2ра упражняваме, чарове от аски таблицата, но 3та изглежда, че извличаме информация от 3 масива и я принтим в хтмл тагове. Правилно ли рабирам или се бъркам?
Здравейте,
Поствам и моите решения с очакване за bugfixes и критика :)
1. Word Mapping - използвам функцията array_count_values() (въпреки че много обичам да си броя стойностите сам, без нея )
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. След поредица от рефакторирания, мисля, че това е едно от най-красивите парчета код, които съм писал :
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 и само един тернарен оператор да върна стойността, която ми трябва.
Колега , и аз реших 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.
Като цяло първия вариант ми се струва по-логичен(да замества всичко срещнато), но втория е доста по-интересен и няма да се учудя, ако ни "закопаят" точно с такъв случай на изпита. Интересно ми е какво мислят и останалите . Поздрави и евала за светкавично решените задачи, включително и 7-ма. Как успяваш ?
Това с match-ването е доста голям проблем на цензуриращите системи. Въпросът е по-скоро концептуален. Така или иначе промяната в кода е малка. Според мен всеки един substring трябва да се цензурира, според други може да е друго. Все пак в Windowss има Windows. В somethingWindowssomething също има.
Иначе съм използвал preg_replace(), защото не разбрах дали str_replace() маха празните елементи.
Една супер добра система ще намира подобни думи (примерно с наставки -s, -ing, -ve, представки pre-, em-, en-... и т. н.) и ще маха и тях. Да, но първо да направиш такава система правиш изкуствен интелект и второ, колкото и добре да я направиш, като тръгнеш да разпознаваш езици става страшно.
Колкото до изпита, там ще бъде ясно упоменато точно какво трябва да се направи.
P. S.: Още не съм довършил 7-ма :D
P. P. S.: Една друга идея - може да търсим думата като substring и да цензурираме цялата дума (включително с къси тирета (Wind-owss) и апострофи (Window'ss, Windowss').
На 5та задача е добре да се разгледат и още два случая, когато думата е в началото на изречението (макар че в условието не е споменато нищо за case-sensitive) и в края. За втория вариант може да се напише preg_match('/\s+' . $_POST["word"] . '\s*.*[.?!]/', $sentence) - т.е. използваме s*(вместо s+), за да се хванат 0 или повече уайтспейси след думата.
Здравейте,
ето една седма задача от мен, след около 4 часа занимавка :)
Solution
Реших да го направя с класове, макар че можеше да направя таблицата под формата на стринг и да я принтирам. Имах доста затруднения около SESSION и POST. Но поне научих, че с POST няма как да прехвърля данните към другата страница, или има? Друго, което ме забави е изкачащото поленце с информация.
Опитах се да направя templating по тази статия Templating, но не знам дали се е получило.
Желая критики
"Но поне научих, че с POST няма как да прехвърля данните към другата страница, или има?"
Оказваш на формата action="file.php" и това ще прати данните в посочената страница :)
Направих същото, но по някаква причина не ми пращаше, може и да не е това....Ще пробвам отново.
5та задача не трябва ли да връща 3 изречения?
This is my cat!
And this is my dog.
Well it is :)
или да разбирам, че е задължително изречението да завършва на ! ? .
Ето и моите решения -- ТУК;
Моля за коментари по последните 2 задачи, дали са правилни т.е. ако бяха на изпит дали щяха да минат проверките :/ .
От условието на 5та задача: A sentence is any sequence of words ending with ., ! or ?.
Аз поне го разбирам, че ако не завършва на един от тези три знака, значи не е изречение :)
Един комплект и от мен. GitHub Много интересно домашно, най-накрая смея да кажа понаучих регулярните изрази
Колега, гледам си ползвал $pattern = '/(?<=[.?!])\s+/';
на пета задача. Някоя ще обясни ли какво точно и как го прави този pattern. Предполагам разделя текста на изречения, ама какво точно прави всяка част от него, например ?<=
Thank you
Здравей, понеже искаме да сплитнем текста на изречения, не можем да ползваме за разделител само whitespace(\s+),защото така ще ни сплитне всяка дума. Нужен ни е израз, който да казва сплитни по whitespace непосредствено предхождан от !, ? или .(точка). Така фактически намираме края на всяко изречение. изразът ?<= казава фактичеки whitespace(\s+) задължително предхождан от !, ? или .(точка).[!?.] и е нужно цялто това нещо да го затворим в група () и се получава (?<=[.?!]). Доста е замотано ще се опитам да ти дам пример ако израза ни е
(?<=foo)bar това ще казва намери всикчи bar които обаче задължително за предхождани от foo. Това ще намри единствено и само foobar и няма да намери foabar, faobar и така нататък. В нашия случай намиране всички (! ),
(. ) и (? ). Надявам се, че успях поне малко да обясня. Ето една много полезна статия за така наречения Lookahead and Lookbehind http://www.rexegg.com/regex-lookarounds.html
Да, много добре обясни, мерси. Направо ставай лектор ;)
Ето едно решение на Sentence Extractor без regex :)
Още решения и от мен. => ТУК
Регулярните изрази са много силен инструмент и е хубаво, че все повече колеги почват да ги разбират!
Ще си позволя един съвет. Когато използвате регулярни изрази, направете така, че да ви свършат максимално от работата.
Пожелавам на всички успех на изпита!
На 6-та задача placeholder-ите ти трябва да са с доларче отпред :) [URL=$1]$2[/URL] Ако е с "\" пред цифрите не сработват, или поне при мен не искат.
P.S. Ти си моето Regex гуру. Само от твоите pattern-и намирам смисъл и разбирам нещо :D
Мерси много, просто следвах лекцията.
P.S. Чак пък гуру.
Това е единственото решение от показаните на 6 задача което не разпознава <a>NO url</a> като валиден URL.
БРАВО!!!
Правилно ли съм разбрал мачването:
'/<a href=[\'\"] - отваря тага, атрибута и кавичките
([^<>]+) - това очевидно е линка, ВЪПРОСА е: защо ползваш ^<> за какъвто и да е текст?
[\'\"]“ - това затваря кавичките и тага
([^<>]+) - това очевидно е съдържанието на тага, същия въпрос
<\/a>/i' - затваря тага и игнорва височината на буквите
Другият ВЪПРОС е как се хващат плейсхолдърите, само с двойни скоби ( ) ли ги разпознава като такива?
може ли малко помощ, извинявам се предварително, че поствам кода директно тук:
if($temp % 2 == 0){
$temp = chr($temp);
echo "<span class='red'> $temp </span>";
}
else{
$temp = chr($temp);
echo "<span class='blue'> $temp </span>";
}
?>
някой вижда ли къде ми е грешката, защото първия символ винаги ми го слага на един ред а всички останали на долния...
Опитай със следното:
if(ord($temp) % 2 == 0) {
echo "<span class=\"red\">$temp</span>";
}
else {
echo "<span class=\"blue\">$temp</span>";
}
Колега, така като даваш само част от кода, трудно някой може да ти помогне.
Колеги, искам да Ви попитам, как се справяте с тест на word - "This" (става въпрос за задача 5 - Sentence Extractor) ? Защото и на мен регулярният израз за търсене на дума е да ми започва и завършва със спейс. Обаче така не ми хваща првата дума от изреченията, защото нали има орязвам white space-овете. Дори и да не ги trim-вам предварително, пак няма да ми хване първата дума от текста. Някакви предложения?
Вместо спейсове може да се сложи \b -> word boundary, и така ще ти хване This :)
Интересното е, че до момента само решението на ZvetanIG на задача 5 работи за Isn't / isn't. Ако обаче се пейстне директно текста, копиран от условието не го хваща заради различния апостроф :)
Упражняваме split (който може да е и с pattern за повече гъвкавост), упражняваме масиви и string-ове. Това са две от трите неща в заглавието на лекцията.
ем и ти си прав, но тези неща ги упражнявахме и в предишни домашни ... както и да е.
Просто като я видях за 1ви път реших, че с решението, което ми хрумна не упражняваме нищо ниво и е един вид workaround, но явно така трябва да бъде.