tibiole

Untitled

Sep 8th, 2025
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 9.09 KB | None | 0 0
  1. <?php
  2. /**
  3.  * 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.
  4.  * @param string $nev Az intézmény eredeti neve
  5.  * @return string Az egységesített, helyesírásilag korrigált intézménynév
  6.  */
  7. function egységesít_intezmenynev($nev) {
  8.     // 1. Definiáljuk a kisbetűsen hagyandó szavakat (kötőszókat, névelőket).
  9.     $kisbetus_szavak = ['és', 'a', 'az'];
  10.    
  11.     // 2. Definiálhatunk néhány gyakori mozaikszót, amit teljes nagybetűre javítunk.
  12.     $mozaikszavak = ['MÁV', 'NATO', 'EU'];  // szükség szerint bővíthető
  13.    
  14.     // 3. Bontsuk fel a nevet szóközök mentén, megőrizve a központozást.
  15.     // Ehhez preg_split használata, amely a szavakat és a köztük levő delimitereket is visszaadja.
  16.     $tokens = preg_split('/([ \t]+)/u', $nev, -1, PREG_SPLIT_DELIM_CAPTURE);
  17.     // A $tokens tömb tartalmazza a szavakat és a közöttük lévő whitespace-t külön elemekben.
  18.    
  19.     $uj_nev = "";  // Ebbe építjük fel az új nevet
  20.    
  21.     foreach ($tokens as $token) {
  22.         // Ha a token csak szóköz (vagy tabulátor), azt változtatás nélkül hozzáfűzzük.
  23.         if (preg_match('/^\s+$/u', $token)) {
  24.             $uj_nev .= $token;
  25.             continue;
  26.         }
  27.        
  28.         // A token most egy szó vagy szó+írásjel kombináció lehet, pl. "Központi", "Hivatal," vagy "XV."
  29.         // Különválasztjuk a token végén esetleg álló írásjeleket (pont, vessző, kötőjel, kettőspont, pontosvessző stb.),
  30.         // hogy csak a betűrészt módosítsuk.
  31.         $ending_punct = '';
  32.         if (preg_match('/[,.!?;:]+$/u', $token, $matches)) {
  33.             // Van írásjel a végén (pl. vessző vagy pont).
  34.             $ending_punct = $matches[0];
  35.             // Vágjuk le az írásjelet a token szórészéről.
  36.             $token = mb_substr($token, 0, mb_strlen($token) - mb_strlen($ending_punct));
  37.         }
  38.        
  39.         // 4. Kezeljük a római számokat (pl. "IV", "XIV.", "XI."):
  40.         if (preg_match('/^[IVXLCDM]+$/u', $token)) {
  41.             // A token teljes egészében római szám (csupa I, V, X, stb.).
  42.             // Hagyjuk változatlanul (csak fűzzük hozzá, ahogy van, nagybetűkkel).
  43.             $uj_nev .= $token . $ending_punct;
  44.             continue;
  45.         }
  46.        
  47.         // 5. Kezeljük a kötőjeles összetételeket.
  48.         if (strpos($token, '-') !== false) {
  49.             // Bontás kötőjel mentén, de megőrizzük a kötőjelet utólagos visszaépítéshez.
  50.             $parts = explode('-', $token);
  51.             // Feldolgozzuk az egyes részeket a szabályok szerint:
  52.             foreach ($parts as $index => $part) {
  53.                 if ($part === "") {
  54.                     // Ha üres rész lenne (pl. ha kötőjellel kezdődött/ért véget a token),
  55.                     // hagyjuk ki. (Jelen esetben nem valószínű, hogy előfordul.)
  56.                     continue;
  57.                 }
  58.                 // Nézzük meg, kisbetűs kivételszó-e (és, a, az).
  59.                 $part_lower = mb_strtolower($part);
  60.                 if (in_array($part_lower, $kisbetus_szavak, true)) {
  61.                     // Kötőjellel egybeírt "és" elvileg nem létezhet szabályosan, de biztos, ami biztos:
  62.                     // kisbetűvel hagyjuk.
  63.                     $parts[$index] = $part_lower;
  64.                 } elseif (mb_strtoupper($part) === $part) {
  65.                     // Ha a rész teljes egészében nagybetűs (pl. mozaikszó), hagyjuk úgy.
  66.                     // Példa: "ELTE-SE" vagy hasonló (bár ilyen nem nagyon fordul elő a listában).
  67.                     $parts[$index] = $part;
  68.                 } else {
  69.                     // Általános eset: nem kivételszó és nem full caps.
  70.                     // Tegyük a teljes részt kisbetűssé, majd az első betűt nagybetűssé.
  71.                     $part = mb_strtolower($part);
  72.                     // 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
  73.                     // egy névelő ("a" vagy "az"), azt nem írjuk nagybetűvel. (Ez egy extrém speciális eset lehet csak.)
  74.                     if ($index === 0 && $uj_nev === "") {
  75.                         // Ez azt jelenti, hogy a név elején vagyunk és a kötőjeles token első részét dolgozzuk fel.
  76.                         // Ha ez 'a' vagy 'az', akkor nagy kezdőbetűvel hagyjuk, különben a normál utat követjük.
  77.                         if ($part_lower === 'a' || $part_lower === 'az') {
  78.                             $part = $part_lower; // marad kisbetűs, de mivel ez a név eleje, később a mondatkezdés miatt úgyis nagy lesz...
  79.                         }
  80.                     }
  81.                     // Alakítsuk nagy kezdőbetűsre.
  82.                     $part = mb_strtoupper(mb_substr($part, 0, 1)) . mb_substr($part, 1);
  83.                     $parts[$index] = $part;
  84.                 }
  85.             }
  86.             // A részeket újra összefűzzük kötőjellel.
  87.             $uj_nev .= implode('-', $parts) . $ending_punct;
  88.         } else {
  89.             // 6. Nincs kötőjel a tokenben, kezeljük egyszerű szóként.
  90.             $word = $token;
  91.             $word_lower = mb_strtolower($word);
  92.             if (in_array($word_lower, $kisbetus_szavak, true)) {
  93.                 // Ha kivételszó (és, a, az), kisbetűsen használjuk.
  94.                 // FIGYELEM: első szóra is alkalmazzuk?
  95.                 // Á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.
  96.                 // Itt feltételezzük, hogy nem név elején áll, vagy ha igen, azt külön kezelnénk.
  97.                 $uj_nev .= $word_lower . $ending_punct;
  98.             } elseif (mb_strtoupper($word) === $word && mb_strlen($word) > 1) {
  99.                 // Ha a szó teljesen nagybetűs és több betűből áll (pl. ELTE), hagyjuk változatlanul.
  100.                 $uj_nev .= $word . $ending_punct;
  101.             } elseif (preg_match('/^[A-Z][a-z]+$/u', $word)) {
  102.                 // Ha a szó "Címformátumú" (első betű nagy, többi kicsi), akkor valószínűleg már jó,
  103.                 // de azért ellenőrizzük a mozaikszó listánkat is:
  104.                 if (in_array(mb_strtoupper($word), $mozaikszavak, true)) {
  105.                     // Ha a word pl. "Nato" és a mozaikszavak közt szerepel "NATO", akkor javítsuk:
  106.                     $uj_nev .= mb_strtoupper($word) . $ending_punct;
  107.                 } else {
  108.                     // Egyébként hagyhatjuk, vagy egységesítésképp le is futtathatunk rajta egy ucfirst-lower kombinációt:
  109.                     $uj_nev .= mb_strtoupper(mb_substr($word_lower, 0, 1)) . mb_substr($word_lower, 1) . $ending_punct;
  110.                 }
  111.             } else {
  112.                 // Minden más eset: általános normalizálás - kisbetűssé tesszük az egész szót, majd első betű nagybetű.
  113.                 $word_lower = mb_strtolower($word);
  114.                 // Külön kezeljük, ha ez a név első szava:
  115.                 if ($uj_nev === "") {
  116.                     // Ha a teljes név elején járunk és ez a szó pl. "a" vagy "az", megtartjuk nagybetűvel kezdve.
  117.                     if ($word_lower === 'a' || $word_lower === 'az') {
  118.                         $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.
  119.                     }
  120.                 }
  121.                 $uj_nev .= mb_strtoupper(mb_substr($word_lower, 0, 1)) . mb_substr($word_lower, 1) . $ending_punct;
  122.             }
  123.         }
  124.     }
  125.    
  126.     return $uj_nev;
  127. }
  128.  
  129. // Teszteljük a függvényt néhány tipikus példán a megadott adatok alapján:
  130. $teszt_nevek = [
  131.     "Magyar Tudományos Akadémia Könyvtár És Információs Központ",
  132.     "Hun-Ren Közgazdaság- És Regionális Tudományi Kutatóközpont",
  133.     "Szolnoki Máv Kórház És Rendelőintézet",
  134.     "Békés Vármegyei Rendőr-Főkapitányság",
  135.     "Sándor-Palota",
  136.     "A Jászkiséri Művelődési Ház És Könyvtár",
  137.     "Magyarország Állandó Képviselete A Nato Mellett, Brüsszel - Védelempolitikai Részleg"
  138. ];
  139. foreach ($teszt_nevek as $nev) {
  140.     echo $nev, " -> ", egységesít_intezmenynev($nev), "\n";
  141. }
  142. /*
  143. Várható eredmények:
  144. 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
  145. 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
  146. Szolnoki Máv Kórház És Rendelőintézet -> Szolnoki MÁV Kórház és Rendelőintézet
  147. Békés Vármegyei Rendőr-Főkapitányság -> Békés Vármegyei Rendőr-főkapitányság
  148. Sándor-Palota -> Sándor-palota
  149. 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
  150. 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
  151. */
  152. ?>
  153.  
Advertisement
Add Comment
Please, Sign In to add comment