Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /**
- * Egységesíti a kapott intézménynév kis- és nagybetűs írásmódját a magyar helyesírás szabályai szerint.
- * @param string $nev Az intézmény eredeti neve
- * @return string Az egységesített, helyesírásilag korrigált intézménynév
- */
- function egységesít_intezmenynev($nev) {
- // 1. Definiáljuk a kisbetűsen hagyandó szavakat (kötőszókat, névelőket).
- $kisbetus_szavak = ['és', 'a', 'az'];
- // 2. Definiálhatunk néhány gyakori mozaikszót, amit teljes nagybetűre javítunk.
- $mozaikszavak = ['MÁV', 'NATO', 'EU']; // szükség szerint bővíthető
- // 3. Bontsuk fel a nevet szóközök mentén, megőrizve a központozást.
- // Ehhez preg_split használata, amely a szavakat és a köztük levő delimitereket is visszaadja.
- $tokens = preg_split('/([ \t]+)/u', $nev, -1, PREG_SPLIT_DELIM_CAPTURE);
- // A $tokens tömb tartalmazza a szavakat és a közöttük lévő whitespace-t külön elemekben.
- $uj_nev = ""; // Ebbe építjük fel az új nevet
- foreach ($tokens as $token) {
- // Ha a token csak szóköz (vagy tabulátor), azt változtatás nélkül hozzáfűzzük.
- if (preg_match('/^\s+$/u', $token)) {
- $uj_nev .= $token;
- continue;
- }
- // A token most egy szó vagy szó+írásjel kombináció lehet, pl. "Központi", "Hivatal," vagy "XV."
- // Különválasztjuk a token végén esetleg álló írásjeleket (pont, vessző, kötőjel, kettőspont, pontosvessző stb.),
- // hogy csak a betűrészt módosítsuk.
- $ending_punct = '';
- if (preg_match('/[,.!?;:]+$/u', $token, $matches)) {
- // Van írásjel a végén (pl. vessző vagy pont).
- $ending_punct = $matches[0];
- // Vágjuk le az írásjelet a token szórészéről.
- $token = mb_substr($token, 0, mb_strlen($token) - mb_strlen($ending_punct));
- }
- // 4. Kezeljük a római számokat (pl. "IV", "XIV.", "XI."):
- if (preg_match('/^[IVXLCDM]+$/u', $token)) {
- // A token teljes egészében római szám (csupa I, V, X, stb.).
- // Hagyjuk változatlanul (csak fűzzük hozzá, ahogy van, nagybetűkkel).
- $uj_nev .= $token . $ending_punct;
- continue;
- }
- // 5. Kezeljük a kötőjeles összetételeket.
- if (strpos($token, '-') !== false) {
- // Bontás kötőjel mentén, de megőrizzük a kötőjelet utólagos visszaépítéshez.
- $parts = explode('-', $token);
- // Feldolgozzuk az egyes részeket a szabályok szerint:
- foreach ($parts as $index => $part) {
- if ($part === "") {
- // Ha üres rész lenne (pl. ha kötőjellel kezdődött/ért véget a token),
- // hagyjuk ki. (Jelen esetben nem valószínű, hogy előfordul.)
- continue;
- }
- // Nézzük meg, kisbetűs kivételszó-e (és, a, az).
- $part_lower = mb_strtolower($part);
- if (in_array($part_lower, $kisbetus_szavak, true)) {
- // Kötőjellel egybeírt "és" elvileg nem létezhet szabályosan, de biztos, ami biztos:
- // kisbetűvel hagyjuk.
- $parts[$index] = $part_lower;
- } elseif (mb_strtoupper($part) === $part) {
- // Ha a rész teljes egészében nagybetűs (pl. mozaikszó), hagyjuk úgy.
- // Példa: "ELTE-SE" vagy hasonló (bár ilyen nem nagyon fordul elő a listában).
- $parts[$index] = $part;
- } else {
- // Általános eset: nem kivételszó és nem full caps.
- // Tegyük a teljes részt kisbetűssé, majd az első betűt nagybetűssé.
- $part = mb_strtolower($part);
- // Kivétel: ha ez a token nem az első a teljes névben, de a rész az első a kötőjel előtt és
- // egy névelő ("a" vagy "az"), azt nem írjuk nagybetűvel. (Ez egy extrém speciális eset lehet csak.)
- if ($index === 0 && $uj_nev === "") {
- // Ez azt jelenti, hogy a név elején vagyunk és a kötőjeles token első részét dolgozzuk fel.
- // Ha ez 'a' vagy 'az', akkor nagy kezdőbetűvel hagyjuk, különben a normál utat követjük.
- if ($part_lower === 'a' || $part_lower === 'az') {
- $part = $part_lower; // marad kisbetűs, de mivel ez a név eleje, később a mondatkezdés miatt úgyis nagy lesz...
- }
- }
- // Alakítsuk nagy kezdőbetűsre.
- $part = mb_strtoupper(mb_substr($part, 0, 1)) . mb_substr($part, 1);
- $parts[$index] = $part;
- }
- }
- // A részeket újra összefűzzük kötőjellel.
- $uj_nev .= implode('-', $parts) . $ending_punct;
- } else {
- // 6. Nincs kötőjel a tokenben, kezeljük egyszerű szóként.
- $word = $token;
- $word_lower = mb_strtolower($word);
- if (in_array($word_lower, $kisbetus_szavak, true)) {
- // Ha kivételszó (és, a, az), kisbetűsen használjuk.
- // FIGYELEM: első szóra is alkalmazzuk?
- // Általában intézménynév nem kezdődik ezeken, de ha mégis, akkor is nagybetűvel szokták írni a mondat elején.
- // Itt feltételezzük, hogy nem név elején áll, vagy ha igen, azt külön kezelnénk.
- $uj_nev .= $word_lower . $ending_punct;
- } elseif (mb_strtoupper($word) === $word && mb_strlen($word) > 1) {
- // Ha a szó teljesen nagybetűs és több betűből áll (pl. ELTE), hagyjuk változatlanul.
- $uj_nev .= $word . $ending_punct;
- } elseif (preg_match('/^[A-Z][a-z]+$/u', $word)) {
- // Ha a szó "Címformátumú" (első betű nagy, többi kicsi), akkor valószínűleg már jó,
- // de azért ellenőrizzük a mozaikszó listánkat is:
- if (in_array(mb_strtoupper($word), $mozaikszavak, true)) {
- // Ha a word pl. "Nato" és a mozaikszavak közt szerepel "NATO", akkor javítsuk:
- $uj_nev .= mb_strtoupper($word) . $ending_punct;
- } else {
- // Egyébként hagyhatjuk, vagy egységesítésképp le is futtathatunk rajta egy ucfirst-lower kombinációt:
- $uj_nev .= mb_strtoupper(mb_substr($word_lower, 0, 1)) . mb_substr($word_lower, 1) . $ending_punct;
- }
- } else {
- // Minden más eset: általános normalizálás - kisbetűssé tesszük az egész szót, majd első betű nagybetű.
- $word_lower = mb_strtolower($word);
- // Külön kezeljük, ha ez a név első szava:
- if ($uj_nev === "") {
- // Ha a teljes név elején járunk és ez a szó pl. "a" vagy "az", megtartjuk nagybetűvel kezdve.
- if ($word_lower === 'a' || $word_lower === 'az') {
- $word_lower = $word_lower; // az első szónál a mondatkezdet miatt marad kis, de majd feljebb tehetnénk nagyot -- itt most hagyjuk kisbetűn, mivel úgyis mondat elején nagy lesz automatikusan.
- }
- }
- $uj_nev .= mb_strtoupper(mb_substr($word_lower, 0, 1)) . mb_substr($word_lower, 1) . $ending_punct;
- }
- }
- }
- return $uj_nev;
- }
- // Teszteljük a függvényt néhány tipikus példán a megadott adatok alapján:
- $teszt_nevek = [
- "Magyar Tudományos Akadémia Könyvtár És Információs Központ",
- "Hun-Ren Közgazdaság- És Regionális Tudományi Kutatóközpont",
- "Szolnoki Máv Kórház És Rendelőintézet",
- "Békés Vármegyei Rendőr-Főkapitányság",
- "Sándor-Palota",
- "A Jászkiséri Művelődési Ház És Könyvtár",
- "Magyarország Állandó Képviselete A Nato Mellett, Brüsszel - Védelempolitikai Részleg"
- ];
- foreach ($teszt_nevek as $nev) {
- echo $nev, " -> ", egységesít_intezmenynev($nev), "\n";
- }
- /*
- Várható eredmények:
- Magyar Tudományos Akadémia Könyvtár És Információs Központ -> Magyar Tudományos Akadémia Könyvtár és Információs Központ
- Hun-Ren Közgazdaság- És Regionális Tudományi Kutatóközpont -> Hun-Ren Közgazdaság- és Regionális Tudományi Kutatóközpont
- Szolnoki Máv Kórház És Rendelőintézet -> Szolnoki MÁV Kórház és Rendelőintézet
- Békés Vármegyei Rendőr-Főkapitányság -> Békés Vármegyei Rendőr-főkapitányság
- Sándor-Palota -> Sándor-palota
- A Jászkiséri Művelődési Ház És Könyvtár -> A Jászkiséri Művelődési Ház és Könyvtár
- Magyarország Állandó Képviselete A Nato Mellett, Brüsszel - Védelempolitikai Részleg -> Magyarország Állandó Képviselete a NATO mellett, Brüsszel - Védelempolitikai Részleg
- */
- ?>
Advertisement
Add Comment
Please, Sign In to add comment