tibiole

Untitled

Sep 8th, 2025
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.89 KB | None | 0 0
  1. <?php
  2. function normalizal_intezmenynev(string $nev): string {
  3.     mb_internal_encoding('UTF-8');
  4.  
  5.     $kisbetus_szavak = ['és','a','az'];
  6.     $mozaikszavak = ['MÁV','NATO','EU','ELTE','OECD','UNESCO','BM','KSH','NAV']; // bővíthető
  7.     $koznevi_masodik_tagok = [
  8.         // tipikus köznevek kötőjel után: ezek kezdőbetűjét kicsire kell venni
  9.         'főkapitányság','kapitányság','főigazgatóság','igazgatóság','kormányhivatal','ügyészség','bíróság',
  10.         'kórház','rendelőintézet','egyetem','főiskola','gimnázium','szakközépiskola','technikum','iskola',
  11.         'múzeum','levéltár','könyvtár','színház','filharmonikusok','palota','intézet','kutatóközpont',
  12.         'kutatóintézet','akadémia','alapítvány','egyesület','hatóság','hivatal','központ','minisztérium',
  13.         'szakszolgálat','szakiskola','speciális szakiskola','nemzeti park','rendőrkapitányság','főegyházmegye',
  14.         'egyházmegye','vármegyei','megyei','kerületi'
  15.     ];
  16.  
  17.     // egyszerű segédek
  18.     $is_all_caps = function(string $s): bool {
  19.         return (mb_strtoupper($s) === $s) && (mb_strtolower($s) !== $s);
  20.     };
  21.     $is_roman = function(string $s): bool {
  22.         return (bool)preg_match('/^[IVXLCDM]+\.?$/u', $s);
  23.     };
  24.     $ucfirst_hu = function(string $s): string {
  25.         $s = mb_strtolower($s);
  26.         return mb_strtoupper(mb_substr($s,0,1)) . mb_substr($s,1);
  27.     };
  28.  
  29.     // tokenizálás: szóközöket megtartjuk
  30.     $tokens = preg_split('/([ \t]+)/u', $nev, -1, PREG_SPLIT_DELIM_CAPTURE);
  31.     $out = '';
  32.  
  33.     foreach ($tokens as $tok) {
  34.         if (preg_match('/^\s+$/u', $tok)) { $out .= $tok; continue; }
  35.  
  36.         // végpontozás leválasztása
  37.         $trail = '';
  38.         if (preg_match('/[,.!?;:]+$/u', $tok, $m)) {
  39.             $trail = $m[0];
  40.             $tok = mb_substr($tok, 0, mb_strlen($tok) - mb_strlen($trail));
  41.         }
  42.  
  43.         // római szám érintetlenül
  44.         if ($is_roman($tok)) { $out .= $tok . $trail; continue; }
  45.  
  46.         // kötőjeles tokenek külön kezelése
  47.         if (mb_strpos($tok, '-') !== false) {
  48.             $parts = explode('-', $tok);
  49.             $norm = [];
  50.             $parts_count = count($parts);
  51.  
  52.             foreach ($parts as $i => $p) {
  53.                 if ($p === '') { $norm[] = $p; continue; }
  54.  
  55.                 $lower = mb_strtolower($p);
  56.                 $upper = mb_strtoupper($p);
  57.  
  58.                 // 1) kisbetűs kivételszavak (ritka kötőjellel, de biztos ami biztos)
  59.                 if (in_array($lower, $kisbetus_szavak, true)) {
  60.                     $norm[] = $lower;
  61.                     continue;
  62.                 }
  63.  
  64.                 // 2) teljes mozaikszó: hagyjuk
  65.                 if ($is_all_caps($p) || in_array($upper, $mozaikszavak, true)) {
  66.                     $norm[] = $upper;
  67.                     continue;
  68.                 }
  69.  
  70.                 // 3) többszörös tulajdonnév-lánc (pl. Jász-Nagykun-Szolnok, Kerpel-Fronius):
  71.                 // ha minden rész "Tulajdon-forma" és egyik sem végződik -i-re, akkor mindet nagy kezdőbetűvel hagyjuk
  72.                 $all_look_like_proper = true;
  73.                 foreach ($parts as $pp) {
  74.                     if ($pp === '') continue;
  75.                     if (!preg_match('/^[A-ZÁÉÍÓÖŐÚÜŰ][a-záéíóöőúüű]+$/u', $pp)) { $all_look_like_proper = false; break; }
  76.                 }
  77.                 if ($all_look_like_proper && !preg_match('/[ií]$/u', $p)) {
  78.                     $norm[] = $ucfirst_hu($p);
  79.                     continue;
  80.                 }
  81.  
  82.                 // 4) ha NEM az első rész ÉS (-i képzős melléknév VAGY tipikus köznév), akkor kis kezdőbetű
  83.                 $should_force_lower_initial =
  84.                     $i > 0 && (
  85.                         preg_match('/[ií]$/u', $lower) ||
  86.                         in_array($lower, $koznevi_masodik_tagok, true)
  87.                     );
  88.  
  89.                 if ($should_force_lower_initial) {
  90.                     // teljes szó kisbetű + vissza, de garantáltan kis kezdőbetű
  91.                     $norm[] = mb_strtolower($p);
  92.                     continue;
  93.                 }
  94.  
  95.                 // 5) alapértelmezés: tulajdonnévszerűre alakítjuk (Nagy kezdő + kis folytatás)
  96.                 $norm[] = $ucfirst_hu($p);
  97.             }
  98.  
  99.             $out .= implode('-', $norm) . $trail;
  100.             continue;
  101.         }
  102.  
  103.         // nem kötőjeles szó:
  104.         $lower = mb_strtolower($tok);
  105.         $upper = mb_strtoupper($tok);
  106.  
  107.         if (in_array($lower, $kisbetus_szavak, true)) {
  108.             $out .= $lower . $trail;
  109.         } elseif ($is_all_caps($tok) || in_array($upper, $mozaikszavak, true)) {
  110.             $out .= in_array($upper, $mozaikszavak, true) ? $upper . $trail : $tok . $trail;
  111.         } else {
  112.             // normál "Címforma"
  113.             $out .= $ucfirst_hu($tok) . $trail;
  114.         }
  115.     }
  116.  
  117.     return $out;
  118. }
  119.  
Advertisement
Add Comment
Please, Sign In to add comment