Často je potřeba přechylovat jména v PHP. Souhlasíte s tím, že věta " Přidat jako přítele Ilyu"Zní to mnohem hůř než" Přidejte Ilyu jako přítele". Proto Skloňování jmen podle velkých a malých písmen v PHP To je vyžadováno poměrně často a v tomto článku vám řeknu, jak to můžete implementovat na svůj web.
Hned řeknu, že bohužel neexistuje žádná ideální možnost. První možnost je velmi zřejmá: najít databázi jmen, která budou ve všech případech, a přidat tuto tabulku do své. Poté podle jména v nominativním případě vyhledejte odpovídající případ v databázi. Nevýhody jsou zde zřejmé: obrovská databáze, nemůže pokrýt všechna jména, další zatížení serveru.
Druhou možností je napsat si vlastní třída skloňování jmen v PHP, nebo použijte již hotový. Vzhledem k tomu, že pravidla v ruštině jsou poměrně složitá a navíc existuje spousta výjimek, budete potřebovat velmi velkou knihovnu, a to ani zdaleka 100% záchrana. Nejoblíbenější ze všech knihoven zabývajících se Skloňování jmen v PHP, je NameCaseLib .
Po stažení této knihovny a umístění na svůj web ji můžete používat takto:
$case = new NCLNameCaseRu(); // Vytvoří objekt třídy NCLNameCaseRu
$array = $case->q("Rusakov Michail Jurijevič"); // Dostaneme pole 6 prvků odpovídajících 6 případům, ve kterých se objeví vstupní řetězec
print_r($array); // Výstup pole
?>
Jak vidíte, používání knihovny je velmi jednoduché. Na druhou stranu moje hlavní rada by byla tato: Pokud je to možné, vyhněte se nutnosti slova úplně skloňovat.. Přesto občas lidé zavedou něco, co se nedá nijak naklonit, a pokusy o navození budou vypadat směšně. Není nutné psát" Přidejte Ilyu jako přítele"Lze to napsat jednoduše" Přidat jako přítele„Na stránce Ilya.
Modul morpher.so je určen pro pádové skloňování slov a slovních spojení - příjmení, křestní jména a patronymie, názvy měst a zboží - v ruštině a ukrajinštině.
Funkce skloňování po pádech
Jeden milion dolarů jde dozNaberezhnye Chelny", "tyč"); ?>!
V důsledku toho dostaneme:
Jeden milion dolarů dostane Vasilij Pupkin z Naberezhnye Chelny!
Funkce morpher_inflect ohýbá frázi v nominativním případě (první argument) na libovolný pád (druhý argument). Případ může mít následující významy:
Všechny řetězce předané do knihovny musí být v kódování UTF-8. Výsledek je vrácen také v UTF-8.
Odpovídající funkce pro ukrajinský jazyk se nazývá morpher_ukr_inflect. Zatím funguje pouze s příjmeními, křestními jmény a patronymií a od ruštiny se liší v názvech případů:
Překlad do množného čísla zatím nebyl v ukrajinské verzi implementován.
Funkce rozdělení jména na komponenty
Funkce morpher_split_fio rozdělí vstupní řetězec na pole příjmení, křestní jméno a druhé jméno
F: Pupkin I: Vasily O:
Pluralizační funkce
Pokud do druhého parametru přidáte řetězec "mn", výsledek bude v množném čísle:
Zbývající skladem 238 .
Ve skladu zbývá 238 pokerů.
Pokud je první parametr již množný, vrátí se následující:
#ERROR: Parametr 1 "text" je množné číslo.
Funkce určení rodu
" y " , " f " => " y " , " n " => " oh " , " p " => " y " ); $name = "experti"; $rod = morpher_get_gender ($name); echo "Respektujeme vás." $ends [ $rod ] . " ". $jméno . " !\n " ; ?>
K určení pohlaví příjmení, křestních jmen a patronymií v ukrajinštině použijte funkci morpher_ukr_get_gender. Vrátí pouze "m" (muž) nebo "f" (žena).
Funkce psaní čísel a peněžních částek
Funkce morpher_spell vygeneruje číslo a vloží danou měrnou jednotku do požadovaného případu:
kalendářní den" ); // 28 (dvacet osm) kalendářních dnů morpher_spell("1,2", "procento"); // 1,2 (jeden bod dva) procenta morpher_spell(2, "den"); // 2 (dva) dny ?>
Pokud potřebujete vložit slova do textu v určitém případě, zadejte velikost písmen jako třetí parametr:
Běhemkalendářní den", "R"); ?> .
Výsledkem je „Do 28 (28) kalendářních dnů.“
Přijatelné velikosti písmen: I, R, D, V, T, P a jejich analogy psané latinkou, viz. Tato funkce nepodporuje tvary předložek (predl-o a gde).
U názvů některých peněžních jednotek vytváří funkce morpher_spell pravopis takto:
Sto dvacet tři rublů 45 kopejek morpher_spell(123,45, "USD"); // Sto dvacet tři amerických dolarů 45 centů morpher_spell(123,45, "euro"); // Sto dvacet tři eur 45 centů?>
V případě potřeby můžete použít zkrácené názvy peněžních jednotek s tečkou nebo bez tečky:
Sto dvacet tři rublů. 45 kop morfer_spell(123,45, "$"); // Sto dvacet tři amerických dolarů 45 centů morpher_spell (123,45, " UAH " ); // Sto dvacet tři UAH. 45 kop?>
Nebo třípísmenné kódy měn mezinárodního standardu ISO 4217, např. RUB, USD, EUR atd. V tomto případě je název země automaticky součástí názvu měny:
Sto dvacet tři ruských rublů 45 kopejek morfer_spell(123,45, "UAH"); // Sto dvacet tři ukrajinské hřivny 45 kopejek morpher_spell(123,45, "KZT"); // Sto dvacet tři kazašských tenge 45 tiynů?>
Chyba při zpracování
Pokud dojde k chybě, všechny funkce knihovny vrátí řádek začínající "#ERROR: " .
#ERROR: Parametr 1 "text" by neměl být prázdný. |
#ERROR: Parametr 2 „case“ by neměl být prázdný. |
#ERROR: Parametr 1 „text“ není ruský. |
#ERROR: Parametr 2 "case" je neplatný. |
#ERROR: Parametr 1 "text" je množné číslo. |
Pokud nechcete, aby uživatel viděl tyto zprávy, zkontrolujte počáteční podřetězec "#ERROR: ".
Funkce morpher_inflect očekává 2 parametry a morpher_get_gender - jeden. Pokud je zavoláno s nesprávným počtem parametrů, interpret PHP vydá varování a pokračuje ve spouštění programu.
Instalace modulu na Linux
Počínaje verzí 1.3.0 poskytujeme modul pro linuxovou verzi PHP ve formě předkompilovaných souborů morpher.so zabalených v archivu. Tyto soubory jsou vhodné pro použití v následujících distribucích Linuxu:
- Debian (Jessie, Stretch, Wheezy);
- Ubuntu (Trusty, Xenial, Cosmic, Bionic);
- CentOS 7.
Jediné, co musíte udělat, je napsat nám, abychom získali morpher.so pro vaši distribuci, extrahovali morpher.so z archivu a morpher.so jako rozšíření PHP. Binární kompatibilita takového modulu s vaším systémem však není zaručena, protože modul stavíme pouze na „čistých“ systémech s výchozím nastavením a s verzí PHP, kterou správce systémových balíčků nabízí. Pokud je modul nekompatibilní, PHP jej nebude moci načíst jako rozšíření. Pokud žádný z hotových souborů modulu není vhodný pro váš systém, musíte modul sestavit z poskytnutého zdrojového kódu.
Pro pohodlí a zjednodušení postupu sestavení modulu obsahuje distribuční sada sadu skriptů, které automatizují instalaci balíčků nezbytných pro kompilaci, sestavení modulu a registraci modulu jako rozšíření pro PHP. Vzhledem k široké škále distribucí operačních systémů, různým možnostem konfigurace a funkcím rozšíření budovy pro php musíte pochopit, že v některých případech může být při instalaci modulu potřeba dalších akcí, které nejsou implementovány pomocí montážních skriptů.
Chcete-li spustit automatickou instalaci, rozbalte distribuci do libovolného adresáře, například morpher:
# mkdir morfér # cd morfér # tar xf ../morpher.tar # cd phpSpusťte skript sestavení pomocí příkazu:
# bash build.shPokud bude úspěšný, soubor modulu morpher.so se zkompiluje a přesune do adresáře php extensions. Modul se zaregistruje v konfiguraci php a funkčnost modulu se zkontroluje automaticky pomocí testu. Textový výstup skriptu sestavení by měl obsahovat zprávu o úspěšném testování:
Probíhají testy... ... hotovo.
Váš modul je připraven k použití. Adresář lze nyní smazat:
# rm -r morférMáte-li problémy se sestavením, musíte se ujistit, že jsou na vašem systému nainstalovány a nakonfigurovány všechny potřebné balíčky. Pro sestavení a provoz modulu musíte nainstalovat:
Pomocí příkazu můžete začít pouze budovat modul bez dalších akcí:
# bash kompilovat.shPo úspěšné kompilaci bude soubor morpher.so umístěn v adresáři morpher/php/modules.
Soubor morpher.so je třeba umístit do adresáře rozšíření PHP, například:
# php-config --extension-dir/usr/lib/php5/20121212 # mv modules/morpher.so /usr/lib/php5/20121212/Adresář rozšíření se může ve vašem systému lišit.
# bash setup.shnebo zadejte název přípony sami v souboru php.ini. Funkčnost rozšíření můžete zkontrolovat ručním spuštěním testovacího PHP skriptu z příkazového řádku:
# php -f test.php Probíhající testy... ... hotovo.Možné chyby při montáži a způsoby jejich odstranění
Chyba: /usr/bin/ld: nelze najít -lm
Důvod: Nemáte nainstalovaný balíček glibc-static.
Chyba: .../include/php/php_config.h:2526:30: chyba: volání přetíženého „isnan(double&)“ je nejednoznačné. (číslo řádku se může lišit podle vaší verze a konfigurace PHP)
Velmi oblíbený problém Weboví programátoři, Tento Skloňování slov v PHP. Potřebujete například zobrazit, před kolika minutami byla zpráva zanechána. Můžete jednoduše napsat číslo a slovo " minut". Ale pak to bude napsáno velmi zvláštně, například " 1 minuta", "2 minuty“ a tak dále. Ve skutečnosti bez Skloňování slov v PHP Nemůžete to udělat, pokud samozřejmě nechcete psát rusky.
Tento problém se začátečníkům bude zdát velmi obtížný, ale ve skutečnosti existuje určitý vzorec skloňování slov. Podívej se sám: " 1 minuta, 2 minuty, 5 minut, 11 minut, 19 minut, 21 minut, 22 minut, 25 minut a tak dále„Vidíš vzor? 1, 21, 31, 41 - vždy bude " minuta Pokud je nejméně významná číslice větší 1 a méně 5 , zatímco samotné číslo při dělení 100 má zbytek větší 20 (to není například číslo 12 a ne 112 ), pak tam bude " minut". V ostatních případech" minut".
funkce getWord($číslo, $přípona) (
$keys = array(2, 0, 1, 1, 1, 2);
$mod = $číslo % 100;
$suffix_key = ($mod > 7 && $mod< 20) ? 2: $keys;
return $suffix[$suffix_key];
}
$array = array("minuta", "minuty", "minuty"); $n = 21;
echo "$n $slovo
";
$n = 11;
$slovo = getWord($n, $pole);
echo "$n $slovo
";
$n = 4;
$slovo = getWord($n, $pole);
echo "$n $slovo
";
?>
Spuštěním tohoto skriptu to uvidíte Skloňování slov v PHP se stane s třeskem. Mohu pouze dodat, že kromě „ minut"může být" den", "hodina", "Člověk", "počítač“ a všechna ostatní podstatná jména, že klesat v závislosti na čísle.
JavaScript je ve vašem prohlížeči blokován. Povolte prosím JavaScript, aby stránka fungovala!
API pro deklinaci slov, získání rodu (mužského, ženského), pád, skloňování a další charakteristiky slova
Rozhraní API pro skloňování slov
Možnosti:skloňovat- slovo nebo seznam slov oddělených mezerou. Následující možnosti jsou dostupné pouze v případě, že je přenášeno jedno slovo.
část mluvy –
Deskriptor | Příklad | Popis |
---|---|---|
C | Matka | podstatné jméno |
P | Červené | přídavné jméno |
KR_APIL | Krásná | krátké přídavné jméno |
INFINITIV | jít | infinitiv |
G | příchod | osobní sloveso |
Participium | chůze | participium |
PARTICIPIUM | jít | participium |
KR_PARTICIPLE | postavený | krátké příčestí |
ČÍSLO | osm | číselný (kvantitativní) |
ČÍSLO-P | osmý | pořadové číslo |
SLEČNA | On | zájmeno-podstatné jméno |
MS-PREDC | nic | predikativní zájmeno |
MS-P | žádný | zájmenné přídavné jméno |
N | Chladný | příslovce |
PŘEDEK | Zajímavý | predikát |
PŘÍPRAVKA | pod | záminka |
SVAZ | A | svaz |
MEZI | Au | citoslovce |
ČASTO | no, chtěl bych | částice |
INVODN | Rozhodně | úvodní slovo |
PHRAZ | plovoucí zátoky, zgi | frazeologická jednotka |
Grammema | Popis | |
---|---|---|
Rod | ||
pan | mužský | |
zhr | ženský | |
St | střední rod | |
mr-zhr | obecné pohlaví (sirotek, opilec) | |
Číslo | ||
Jednotky | jednotné číslo | |
pl | množný | |
Pouzdro | ||
jim | jmenovaný | |
rd | genitiv | |
dt | dativ | |
vn | akuzativ | |
televize | instrumentální | |
atd | předložkový | |
zvuk | vokativ (otec, bůh) | |
2 | druhý genitiv nebo druhý předložkový pád | |
Čas | ||
nst | přítomnost | |
vůle | Budoucí čas | |
prsh | minulý čas | |
Tvář | ||
1l | první osoba | |
2l | druhá osoba | |
3l | třetí strana | |
Animace | ||
od | animovat | |
Ale | neživý | |
Pohled | ||
Svatý. | dokonalý výhled | |
ns | nedokonalý druh | |
Tranzitivita | ||
np | přechod | |
ne | intranzitivní | |
Slib | ||
dst | aktivní hlas | |
strana | pasivní hlas | |
jiný | ||
0 | neměnný | |
bezl | neosobní sloveso | |
pvl | rozkazovací způsob (imperativ) | |
atrakce | přivlastňovací (nepoužito) | |
předchozí | superlativ (pro přídavná jména) | |
porovnat | srovnávací stupeň (pro přídavná jména) | |
kvalitní | kvalitativní přídavné jméno | |
Sémantické rysy | ||
název | jméno (Ivan, Michail) | |
femme | příjmení (Ivanov, Sidorov) | |
zpráva | patronymum (Ivanovič, Michajlovič) | |
lok | toponym (Moskva, Lena, Everest) | |
zkr | zkratka (KPSS, RONO) | |
org | organizace | |
otázka | tázací příslovce | |
naznačit | ukazovací příslovce | |
slang | žargon | |
rozklad | hovorový | |
oblouk | archaismus | |
HRH | překlep | |
básník | poetický | |
prof | profesionalita |
Http://site/service/api.php?inflect=Magadan&json
("0":"MAGADAN","1":"MAGADAN","2":"MAGADAN","3":"MAGADAN","4":"MAGADAN","5":"MAGADAN"," 6":"MAGADANY","7":"MAGADANA","8":"MAGADANA","9":"MAGADANA","limit":38)
Http://site/service/api.php?inflect=Magadan
Http://site/service/api.php?inflect=Rostov-on-Don&xml
Chcete-li získat všechna neživá přídavná jména v množném čísle od slova „svatba“, zavolejte:
Https://site/service/api.php?inflect=wedding&json&partofspeech=P&grammems=NO,MN&info
Dostat:
("0":("slovo":"SVATBA","partofspeech":"P","grammems":["DT","QUALITY","MN","NE","OD"]), " 1":("slovo":"SVATBA","partofspeech":"P","grammems":["IM","QUALITY","MN","ALE","OD"]), "2" :("word":"SVATBA","partofspeech":"P","grammems":["VN","KACH","MN","VUT"]), "3":("slovo": "WEDDING","partofspeech":"P","grammems":["QUALITY","MN","ALE","OD","RD"]), "4":("slovo":"SVATBA ","partofspeech":"P","grammems":["QUALITY","MN","ALE","OD","PR"]), "5":("word":"SVATBA" " partofspeech":"P","grammems":["QUALITY","MN","NO","OD","TV"]) ,,"limit":19) Bez parametru info:
http://site/service/api.php?inflect=wedding&json&partofspeech=P&grammems=NO,MN
("0":"SVATBA","1":"SVATBA","2":"SVATBA","3":"SVATBA", "4":"SVATBA","5":"SVATBA"," limit":19)
API pro získání slovního rodu, jména: muž, žena
API pro získání pohlaví: muž, žena podle jména. Pomocí tohoto rozhraní API můžete získat pohlaví uživatele pomocí uživatelského jména. Odpadne tak nutnost vyplňovat při registraci další formulář.
Dobrý den, Habrahabr!
Dnes budu mluvit o malém, ale velmi užitečném frameworku – NameCaseLib.
Myslím, že mnozí se setkali se situací, kdy bylo nutné odmítnout příjmení, křestní jméno a patronymii jednotlivě. Tento rámec nám pomůže zbavit se mnoha „kol“.
Instalace
Aby NameCaseLib fungoval, potřebujeme PHP5 a knihovnu php_mbstring pro práci s textem ve formátu UTF-8.Skvělé, nyní zbývá pouze připojit samotný framework, k tomu si stáhneme potřebné soubory.
NameCaseLib podporuje dva jazyky: ruštinu a ukrajinštinu. Soubor NCL.NameCase.ru.php obsahuje ruská deklinační pravidla, NCL.NameCase.ua.php, respektive ukrajinská. Složka NCL obsahuje samotné „jádro“ frameworku, tedy sadu základních funkcí.
Pojďme si tedy vytvořit soubor ve formátu .php a zkontrolovat funkčnost tohoto frameworku.
# Указываем кодировку. header("Content-type: text/html; charset=utf-8"); # Подключаем русские правила склонения. require "NCL.NameCase.ru.php"; # Объявляем объект класса. $case = new NCLNameCaseRu(); # Метод q - склоняет Фамилию, Имя и Отчество человека по правилам пола. $array = $case->q("Maksimov Alexander Vasilievich"); # Výstup výsledného pole. (Poznámka: vrací jednoduché indexovatelné pole) var_dump($array); ?>
V souladu s tím můžeme stejným způsobem odmítnout ukrajinská celá jména spojením ukrajinských pravidel skloňování.
Podívejme se ale ještě na to, jaké parametry metoda obsahuje q a jak se to dá ještě využít?
Tato metoda má 3 parametry, 2 z nich lze vynechat. Prvním parametrem je celé jméno osoby, druhým je případ (níže uvedu seznam konstant; pokud případ není uveden (NULL), pak metoda vrátí všechny případy) a třetím je pohlaví osoby. (Konstanty jsou také uvedeny níže; pokud neuvedete pohlaví (NULL), metoda jej určí sama)
Konstanty
K označení pohlaví se používají konstanty:- NCL::$MAN – mužský rod
- NCL::$WOMAN – žena
Pro označení případů ruského jazyka:
- NCL::$IMENITLN - nominativní případ
- NCL::$RODITLN - pád genitivu
- NCL::$DATELN - dativní případ
- NCL::$VINITELN - případ akuzativu
- NCL::$TVORITELN - instrumentální pouzdro
- NCL::$PREDLOGN - pád předložek
Pro označení případů ukrajinského jazyka:
- NCL::$UaNazyvnyi – jmenovka
- NCL::$UaRodovyi – obecný pohled
- NCL::$UaDavalnyi – dlouholetý admin
- NCL::$UaZnahidnyi – slavné video
- NCL::$UaOrudnyi – zobrazení zbraní
- NCL::$UaMiszevyi – miscevyi vidminok
- NCL::$UaKlychnyi – osobní poznámka
Poznámky
- Na pořadí jména nezáleží.
- Nezáleží na tom, v jakém případě je uvedeno celé jméno, po skloňování metoda vrací uloženou velikost písmen.
Definice části celého jména
Pomocí metody getFullNameFormat můžeme určit část, respektive jaké části celého jména používáme.
# Указываем кодировку. header("Content-type: text/html; charset=utf-8"); # Подключаем русские правила склонения. require "NCL.NameCase.ru.php"; # Объявляем объект класса. $case = new NCLNameCaseRu(); # Метод getFullNameFormat - разбивает строку и возвращает формат, в котором записано имя. $fullName = $case->getFullNameFormat("Maksimov Alexander Vasilievich"); /* Dostaneme formát jako: S F N, kde: - S - Příjmení - N - Jméno - F - Druhé jméno */ echo $fullName; ?>
Co byste ale měli dělat, pokud framework stále nedokáže správně určit, jak odmítnout vámi zvolené jméno?
Pro tento účel knihovna poskytuje metodu qFullName, která umožňuje zadat příjmení, jméno, patronymii a pohlaví osoby v určitém pořadí.
# Указываем кодировку. header("Content-type: text/html; charset=utf-8"); # Подключаем русские правила склонения. require "NCL.NameCase.ru.php"; # Объявляем объект класса. $case = new NCLNameCaseRu(); # Параметры метода: qFullName(Фамилия, Имя, Отчество, пол, падеж, формат); Все параметры являются необязательными, если, например, не указать пол - система сама определит его. echo $nc->qFullName("Maksimov", "Alexander", "Vasilievich", NCL::$MAN, NCL::$TVORITELN, "S N F")."\n"; ?>