Full navn deklinasjon - NameCaseLib PHP Framework. Bøyning av ord i PHP Bøyning til genitiv kasus php

Det er ofte et behov bøy navn i PHP. Enig at uttrykket " Legg til som venn Ilya"høres mye verre ut enn" Legg til Ilya som venn". Derfor Deklinasjon av navn etter store og små bokstaver i PHP Dette kreves ganske ofte, og i denne artikkelen vil jeg fortelle deg hvordan du kan implementere dette på nettstedet ditt.

Jeg vil si med en gang at det dessverre ikke er noe ideelt alternativ. Det første alternativet er veldig åpenbart: finn en database med navn som vil være i alle tilfeller, og legg denne tabellen til din. Deretter, ved navn i nominativ kasus, se etter tilsvarende kasus i databasen. Ulempene her er åpenbare: stor database, kan ikke dekke alle navnene, ekstra belastning på serveren.

Det andre alternativet er å skrive din egen klasse av navneforbedringer i PHP, eller bruk en ferdig. Siden reglene på det russiske språket er ganske komplekse, pluss at det er mange unntak, vil det derfor være nødvendig med et veldig stort bibliotek, og selv dette er langt fra 100% redningen. Den mest populære av alle biblioteker som har å gjøre med Deklinasjon av navn i PHP, er NameCaseLib .

Etter å ha lastet ned dette biblioteket og plassert det på nettstedet ditt, kan du bruke det slik:

Require_once "NCL.NameCase.ru.php"; // Koble til det russiske biblioteket
$case = new NCLNameCaseRu(); // Lag et objekt av NCLNameCaseRu-klassen
$array = $case->q("Rusakov Mikhail Yurievich"); // Vi får en matrise med 6 elementer som tilsvarer 6 tilfeller der inndatastrengen vil vises
print_r($array); // Skriv ut matrisen
?>

Som du kan se, er det veldig enkelt å bruke biblioteket. På den annen side vil mitt hovedråd være dette: Hvis mulig, unngå behovet for å bøye ord helt.. Likevel, noen ganger vil folk introdusere noe som ikke kan tilbøyes på noen måte, og forsøk på å indusere det vil se latterlig ut. Det er ikke nødvendig å skrive " Legg til Ilya som venn"Det kan skrives enkelt" Legg til som venn"på Ilyas side.

Morpher.so-modulen er designet for kasus-deklinasjon av ord og uttrykk - etternavn, fornavn og patronymer, navn på byer og varer - på russisk og ukrainsk.

Deklinasjonsfunksjon etter kasus

En million dollar går tilfraNaberezhnye Chelny", "stang" ); ?> !

Som et resultat får vi:

En million dollar går til Vasily Pupkin fra Naberezhnye Chelny!

Morpher_inflect-funksjonen bøyer en frase i nominativ kasus (første argument) til et hvilket som helst kasus (andre argument). Saken kan ha følgende betydninger:

Alle strenger som sendes til biblioteket må være i UTF-8-koding. Resultatet returneres også i UTF-8.

Den tilsvarende funksjonen for det ukrainske språket kalles morpher_ukr_inflect. Så langt fungerer det bare med etternavn, fornavn og patronymer og skiller seg fra russisk når det gjelder navn på tilfeller:

Oversettelse til flertall er ennå ikke implementert i den ukrainske versjonen.

Funksjon for å dele opp et navn i komponenter

Morpher_split_fio-funksjonen deler inndatastrengen i en rekke med etternavn, fornavn, mellomnavn

F: Pupkin I: Vasily O:

Pluraliseringsfunksjon

Hvis du legger til strengen "mn" til den andre parameteren, vil resultatet være i flertall:

Gjenstår på lager 238 .

Det er 238 poker igjen på lageret.

Hvis den første parameteren allerede er flertall, vil følgende bli returnert:

#FEIL: Parameter 1 "tekst" er flertall.

Slektsbestemmelsesfunksjon

" y " , " f " => " y " , " n " => " oh " , " p " => " y " ); $name = "eksperter"; $rod = morpher_get_gender ($navn); ekko "Vi respekterer deg." $endelser [ $stang ] . " " . $navn. " !\n " ; ?>

For å bestemme kjønn på etternavn, fornavn og patronymer på ukrainsk, bruk morpher_ukr_get_gender-funksjonen. Den returnerer bare "m" (mann) eller "f" (kvinne).

Funksjon for å skrive tall og pengebeløp

Morpher_spell-funksjonen danner stavemåten til tallet og setter den gitte måleenheten i ønsket tilfelle:

kalenderdag" ); // 28 (tjueåtte) kalenderdager morpher_spell("1.2", "prosent"); // 1,2 (ett komma to) prosent morpher_spell(2, "dag"); // 2 (to) dager ?>

Hvis du trenger å sette inn ord i teksten i en bestemt kasus, spesifiser kasus som den tredje parameteren:

I løpet avkalenderdag" , " R " ); ?> .

Som et resultat får vi "Innen 28 (tjueåtte) kalenderdager."

Akseptable kasusverdier: I, R, D, V, T, P og deres analoger skrevet på latin, se. Preposisjonsformer (predl-o og gde) støttes ikke i denne funksjonen.

For navnene på noen pengeenheter produserer morpher_spell-funksjonen en stavemåte som denne:

Ett hundre og tjuetre rubler 45 kopek morpher_spell(123.45, "USD"); // Ett hundre og tjuetre amerikanske dollar 45 cent morpher_spell(123.45, "euro"); // Ett hundre og tjuetre euro 45 cent?>

Om ønskelig kan du bruke forkortede navn på pengeenheter, med eller uten prikk:

Ett hundre og tjuetre rubler. 45 kopek morpher_spell(123.45, "$"); // Ett hundre og tjuetre amerikanske dollar 45 cent morpher_spell (123.45, " UAH " ); // Ett hundre og tjuetre UAH. 45 kopek?>

Eller valutakoder på tre bokstaver i den internasjonale standarden ISO 4217, for eksempel RUB, USD, EUR, osv. I dette tilfellet er navnet på landet automatisk inkludert i navnet på valutaen:

Ett hundre og tjuetre russiske rubler 45 kopek morpher_spell(123.45, "UAH"); // Ett hundre og tjuetre ukrainske hryvnia 45 kopek morpher_spell(123.45, "KZT"); // Ett hundre og tjuetre kasakhiske tenge 45 tiyns?>

Feil under behandling

Hvis det oppstår en feil, returnerer alle bibliotekfunksjoner en linje som starter med "#FEIL: " .

#FEIL: Parameter 1 "tekst" skal ikke være tom.
#FEIL: Parameter 2 "case" skal ikke være tom.
#FEIL: Parameter 1 "tekst" er ikke russisk.
#FEIL: Parameter 2 "case" er ugyldig.
#FEIL: Parameter 1 "tekst" er flertall.

Hvis du ikke vil at brukeren skal se disse meldingene, se etter den første understrengen "#FEIL: " .

Morpher_inflect-funksjonen forventer 2 parametere, og morpher_get_gender - en. Hvis det kalles opp med feil antall parametere, sender PHP-tolken en advarsel og fortsetter å kjøre programmet.

Installere modulen på Linux

Fra og med versjon 1.3.0 tilbyr vi en modul for Linux-versjonen av PHP i form av forhåndskompilerte morpher.so-filer pakket i et arkiv. Disse filene er egnet for bruk på følgende Linux-distribusjoner:

  • Debian (Jessie, Stretch, Wheezy);
  • Ubuntu (Trusty, Xenial, Cosmic, Bionic);
  • CentOS 7.

Alt du trenger å gjøre er å skrive til oss for å få morpher.so for distribusjonen din, trekke ut morpher.so fra arkivet og morpher.so som en PHP-utvidelse. Binær kompatibilitet av en slik modul med systemet ditt er imidlertid ikke garantert, siden vi bygger modulen kun på "rene" systemer med standardinnstillinger og med versjonen av PHP som systempakkebehandlingen tilbyr. Hvis en modul er inkompatibel, vil PHP ikke kunne laste den som en utvidelse. Hvis ingen av de ferdiglagde modulfilene passer for systemet ditt, må du bygge modulen fra den medfølgende kildekoden.

For enkelhets skyld og forenkling av modulmonteringsprosedyren inkluderer distribusjonssettet et sett med skript som automatiserer installasjonen av pakker som er nødvendige for kompilering, modulmontering og modulregistrering som en utvidelse for PHP. Tatt i betraktning det store utvalget av operativsystemdistribusjoner, ulike konfigurasjonsalternativer og funksjoner i byggeutvidelser for php, må du forstå at i noen tilfeller, når du installerer en modul, kan det være behov for ytterligere handlinger som ikke implementeres av monteringsskript.

For å starte den automatiske installasjonsprosedyren, pakk ut distribusjonen i en hvilken som helst katalog, for eksempel morpher:

# mkdir morpher # cd morpher # tar xf ../morpher.tar # cd php

Kjør byggeskriptet med kommandoen:

# bash build.sh

Hvis det lykkes, vil morpher.so-modulfilen bli kompilert og flyttet til php-utvidelseskatalogen. Modulen vil bli registrert i php-konfigurasjonen, og funksjonaliteten til modulen vil bli sjekket automatisk ved hjelp av en test. Tekstutgangen til monteringsskriptet skal inneholde en melding som indikerer vellykket testing:

Kjører tester... ... gjort.

Modulen din er klar til bruk. Katalogen kan nå slettes:

# rm -r morpher

Hvis du har problemer med konstruksjonen, må du sørge for at alle nødvendige pakker er installert og konfigurert på systemet ditt. For å sette sammen og betjene modulen må du installere:

Du kan bare begynne å bygge modulen uten ytterligere handlinger med kommandoen:

# bash compile.sh

Etter vellykket kompilering vil morpher.so-filen bli plassert i katalogen morpher/php/modules.

Morpher.so-filen må plasseres i PHP-utvidelseskatalogen, for eksempel:

# php-config --extension-dir/usr/lib/php5/20121212 # mv modules/morpher.so /usr/lib/php5/20121212/

Utvidelseskatalogen kan være annerledes på systemet ditt.

# bash setup.sh

eller spesifiser filtypen selv i php.ini-filen. Du kan sjekke funksjonaliteten til utvidelsen ved å kjøre et test PHP-skript manuelt fra kommandolinjen:

# php -f test.php Kjører tester... ... gjort.

Mulige feil under montering og måter å eliminere dem på

Feil: /usr/bin/ld: finner ikke -lm

Årsak: Du har ikke installert glibc-static-pakken.

Feil: .../include/php/php_config.h:2526:30: feil: anrop av overbelastet 'isnan(double&)' er tvetydig. (linjenummeret kan variere i PHP-versjonen og konfigurasjonen)

Et veldig populært problem Nettprogrammerere, Dette Deklinasjon av ord i PHP. Du må for eksempel vise hvor mange minutter siden en melding ble lagt igjen. Du kan ganske enkelt skrive et tall og et ord " minutter". Men da blir det skrevet veldig merkelig, for eksempel " 1 minutt", "2 minutter" og så videre. Faktisk uten Deklinasjon av ord i PHP Du kan ikke gjøre det med mindre du selvfølgelig vil skrive på russisk.

Problemet vil virke veldig vanskelig for nybegynnere, men faktisk er det et visst mønster for deklinasjonen av ord. Se for deg selv: " 1 minutt, 2 minutter, 5 minutter, 11 minutter, 19 minutter, 21 minutter, 22 minutter, 25 minutter og så videre"Ser du et mønster? 1, 21, 31, 41 - vil alltid være " minutt". Hvis det minst signifikante sifferet er større 1 og mindre 5 , mens selve tallet delt på 100 har en rest større 20 (det er for eksempel ikke et tall 12 og ikke 112 ), så blir det " minutter". I andre tilfeller" minutter".

funksjon getWord($nummer, $suffiks) (
$keys = array(2, 0, 1, 1, 1, 2);
$mod = $nummer % 100;
$suffix_key = ($mod > 7 && $mod< 20) ? 2: $keys;
returner $suffix[$suffix_key];
}
$array = array("minutt", "minutter", "minutter"); $n = 21;

ekko "$n $ord
";
$n = 11;
$word = getWord($n, $array);
ekko "$n $ord
";
$n = 4;
$word = getWord($n, $array);
ekko "$n $ord
";
?>

Ved å kjøre dette skriptet vil du se det Deklinasjon av ord i PHP skjer med et smell. Jeg kan bare legge til det i tillegg til " minutter"det kan være" dag", "time", "Menneskelig", "datamaskin" og alle andre substantiv det nedgang avhengig av tallet.

JavaScript er blokkert i nettleseren din. Aktiver JavaScript for at nettstedet skal fungere!

API for orddeklinasjon, få kjønn (maskulint, feminint), kasus, deklinasjon og andre egenskaper ved et ord

Orddeklinasjons-API

Alternativer:
bøye- et ord eller en liste over ord atskilt med et mellomrom. Følgende alternativer er bare tilgjengelige hvis ett ord overføres.
del av en tale
BeskrivelseEksempelBeskrivelse
CMorsubstantiv
Prødadjektiv
KR_APILvakkerkort adjektiv
INFINITIVinfinitiv
Gkommerpersonlig verb
PARTISIPPpartisipp
PARTISIPPgårpartisipp
KR_PARTICIPLEbyggetkort partisipp
ANTALLåttetall (kvantitativ)
NUMBER-Påttendeordinært tall
MSHanpronomen-substantiv
MS-PREDCingentingpredikativt pronomen
MS-Pnoenpronominal adjektiv
NKuladverb
FORFARInteressantpredikat
FORETREKKERunderpåskudd
UNIONOgfagforening
MELLOMauinterjeksjon
HYPPIGvel, villepartikkel
INVODNSikkertinnledende ord
PHRAZflyndre bukter, zgifraseologisk enhet
grammer– . Spesifisert atskilt med "," (komma). For å ekskludere, angi "-" (minus) før grammet.
GrammemaBeskrivelse
Slekt
MRmaskulin
zhrfeminin
onsintetkjønn
mr-zhrgenerelt kjønn (foreldreløs, fylliker)
Antall
enheterentall
plflertall
Sak
demnominativ
rdgenitiv
dtdativ
vnakkusativ
TVinstrumental
etcpreposisjon
lydvokativ (far, gud)
2 andre genitiv eller andre preposisjonelle kasus
Tid
nstnåtid
vilFremtid
prshfortid
Ansikt
1 lførsteperson
2landre person
3 ltredjepart
Animasjon
odanimere
Menlivløs
Utsikt
St.perfekt utsikt
nsufullkomne arter
Transitivitet
npovergang
neintransitiv
Løfte
dstaktiv stemme
sidepassiv stemme
Annen
0 uforanderlig
bezlupersonlig verb
pvlimperativ stemning (imperativ)
tiltrekningbesittende (ikke brukt)
forrigesuperlativ (for adjektiver)
sammenlignekomparativ grad (for adjektiver)
kvalitetkvalitativt adjektiv
Semantiske trekk
Navnnavn (Ivan, Mikhail)
femmeetternavn (Ivanov, Sidorov)
rapporterepatronymisk (Ivanovich, Mikhailovich)
loktoponym (Moskva, Lena, Everest)
abbrforkortelse (KPSS, RONO)
orgorganisasjon
spørsmålspørrende adverb
indikererdemonstrativt adverb
slangsjargong
nedbrytningdagligdagse
buearkaisme
HRHskrivefeil
dikterpoetisk
profprofesjonalitet
info– vis hvert skjema som en matrise med tilleggsinformasjon

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

<0>ROSTOV-ON-DON <1>ROSTOV-ON-DON <2>ROSTOV-ON-DON <3>ROSTOV-ON-DON <4>ROSTOV-ON-DON 46

For å få alle de livløse flertallsadjektivene fra ordet "bryllup" ring:

Https://site/service/api.php?inflect=wedding&json&partofspeech=P&grammems=NO,MN&info
Få:
("0":("word":"BRYLLUP","partofspeech":"P","grammems":["DT","QUALITY","MN","NO","OD"]), " 1":("word":"BRYLLUP","partofspeech":"P","grammems":["IM","QUALITY","MN","MEN","OD"]), "2" :("word":"BRYLLUP","partofspeech":"P","grammems":["VN","KACH","MN","MEN"]), "3":("word": "WEDDING","partofspeech":"P","grammems":["QUALITY","MN","MEN","OD","RD"]), "4":("word":"BRYLLUP ","partofspeech":"P","grammems":["KVALITET","MN","MEN","OD","PR"]), "5":("word":"BRYLLUP" " partofspeech":"P","grammems":["QUALITY","MN","NO","OD","TV"]) ,,"limit":19) Uten info-parameteren:
http://site/service/api.php?inflect=wedding&json&partofspeech=P&grammems=NO,MN
("0":"BRYLLUP","1":"BRYLLUP","2":"BRYLLUP","3":"BRYLLUP", "4":"BRYLLUP","5":"BRYLLUP"," grense":19)

API for å få ord kjønn, navn: mann, kvinne

API for å få kjønn: mann, kvinne ved navn. Ved å bruke denne API-en kan du få brukerens kjønn ved å bruke brukernavnet. Dette vil eliminere behovet for å fylle ut et tilleggsskjema under registreringen.

Hei, Habrahabr!

I dag skal jeg snakke om et lite, men veldig nyttig rammeverk - NameCaseLib.

Jeg tror mange har vært borti en situasjon der det var nødvendig å avslå en persons etternavn, fornavn og patronym i sak. Dette rammeverket vil hjelpe oss med å bli kvitt mange "sykler".

Installasjon

For at NameCaseLib skal fungere, trenger vi PHP5 og php_mbstring-biblioteket for å fungere med tekst i UTF-8-format.

Flott, nå gjenstår det bare å koble til selve rammeverket, for dette vil vi laste ned de nødvendige filene.

NameCaseLib støtter to språk: russisk og ukrainsk. Filen NCL.NameCase.ru.php inneholder russiske deklinasjonsregler, henholdsvis NCL.NameCase.ua.php, ukrainske. NCL-mappen inneholder selve "kjernen" i rammeverket, det vil si et sett med grunnleggende funksjoner.

Så la oss lage en fil i .php-format og sjekke funksjonaliteten til dette rammeverket.

q("Maksimov Alexander Vasilievich"); # Skriv ut den resulterende matrisen. (Merk: returnerer en enkel indekserbar matrise) var_dump($array); ?>

Følgelig kan vi på samme måte avvise ukrainske fulle navn ved å koble sammen ukrainske deklinasjonsregler.

Men la oss fortsatt se på hvilke parametere metoden inneholder q, og hvordan kan den ellers brukes?

Denne metoden har 3 parametere, 2 av dem kan utelates. Den første parameteren er personens fulle navn, den andre er tilfellet (jeg vil gi en liste over konstanter nedenfor; hvis tilfellet ikke er spesifisert (NULL), returnerer metoden alle tilfeller), og den tredje er personens kjønn. (Konstantene er også gitt nedenfor; hvis du ikke spesifiserer kjønn (NULL), vil metoden bestemme det selv)

Konstanter

For å indikere kjønn brukes konstanter:
  • NCL::$MAN – mannlig kjønn
  • NCL::$WOMAN – kvinne

For å indikere tilfeller av det russiske språket:

  • NCL::$IMENITLN - nominativ kasus
  • NCL::$RODITLN - genitiv kasus
  • NCL::$DATELN - dativkasus
  • NCL::$VINITELN - akkusativ kasus
  • NCL::$TVORITELN - instrumentalkasse
  • NCL::$PREDLOGN - preposisjonssak

For å indikere tilfeller av det ukrainske språket:

  • NCL::$UaNazyvnyi – navneskilt
  • NCL::$UaRodovyi – generisk visning
  • NCL::$UaDavalnyi – langsiktig admin
  • NCL::$UaZnahidnyi – kjent video
  • NCL::$UaOrudnyi – våpenvisning
  • NCL::$UaMiszevyi – miscevyi vidminok
  • NCL::$UaKlychnyi – personlig notat

Notater

  1. Rekkefølgen på navnet spiller ingen rolle.
  2. Det spiller ingen rolle i hvilket tilfelle det fulle navnet angis, etter deklinasjon returnerer metoden de lagrede store og små bokstavene.

Definisjon av en del av fullt navn

Ved å bruke getFullNameFormat-metoden kan vi bestemme delen, eller hvilke deler av det fulle navnet vi bruker.

getFullNameFormat("Maksimov Alexander Vasilievich"); /* Vi får et format som: S F N, hvor: - S - Etternavn - N - Fornavn - F - Mellomnavn */ echo $fullName; ?>

Men hva bør du gjøre hvis rammeverket fortsatt ikke kan bestemme hvordan du skal avslå det valgte navnet ditt?

For dette formålet tilbyr biblioteket qFullName-metoden, som lar deg spesifisere etternavn, fornavn, patonym og kjønn til en person i en bestemt rekkefølge.

qFullName("Maksimov", "Alexander", "Vasilievich", NCL::$MAN, NCL::$TVORITELN, "S N F")."\n"; ?>

Resultater

NameCaseLib er et virkelig brukervennlig rammeverk som inkluderer mange nyttige funksjoner. Nettstedet har fullstendig dokumentasjon på russisk.