Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- function normalizal_intezmenynev(string $nev): string {
- mb_internal_encoding('UTF-8');
- $kisbetus_szavak = ['és','a','az'];
- $mozaikszavak = ['MÁV','NATO','EU','ELTE','OECD','UNESCO','BM','KSH','NAV']; // bővíthető
- $koznevi_masodik_tagok = [
- // tipikus köznevek kötőjel után: ezek kezdőbetűjét kicsire kell venni
- 'főkapitányság','kapitányság','főigazgatóság','igazgatóság','kormányhivatal','ügyészség','bíróság',
- 'kórház','rendelőintézet','egyetem','főiskola','gimnázium','szakközépiskola','technikum','iskola',
- 'múzeum','levéltár','könyvtár','színház','filharmonikusok','palota','intézet','kutatóközpont',
- 'kutatóintézet','akadémia','alapítvány','egyesület','hatóság','hivatal','központ','minisztérium',
- 'szakszolgálat','szakiskola','speciális szakiskola','nemzeti park','rendőrkapitányság','főegyházmegye',
- 'egyházmegye','vármegyei','megyei','kerületi'
- ];
- // egyszerű segédek
- $is_all_caps = function(string $s): bool {
- return (mb_strtoupper($s) === $s) && (mb_strtolower($s) !== $s);
- };
- $is_roman = function(string $s): bool {
- return (bool)preg_match('/^[IVXLCDM]+\.?$/u', $s);
- };
- $ucfirst_hu = function(string $s): string {
- $s = mb_strtolower($s);
- return mb_strtoupper(mb_substr($s,0,1)) . mb_substr($s,1);
- };
- // tokenizálás: szóközöket megtartjuk
- $tokens = preg_split('/([ \t]+)/u', $nev, -1, PREG_SPLIT_DELIM_CAPTURE);
- $out = '';
- foreach ($tokens as $tok) {
- if (preg_match('/^\s+$/u', $tok)) { $out .= $tok; continue; }
- // végpontozás leválasztása
- $trail = '';
- if (preg_match('/[,.!?;:]+$/u', $tok, $m)) {
- $trail = $m[0];
- $tok = mb_substr($tok, 0, mb_strlen($tok) - mb_strlen($trail));
- }
- // római szám érintetlenül
- if ($is_roman($tok)) { $out .= $tok . $trail; continue; }
- // kötőjeles tokenek külön kezelése
- if (mb_strpos($tok, '-') !== false) {
- $parts = explode('-', $tok);
- $norm = [];
- $parts_count = count($parts);
- foreach ($parts as $i => $p) {
- if ($p === '') { $norm[] = $p; continue; }
- $lower = mb_strtolower($p);
- $upper = mb_strtoupper($p);
- // 1) kisbetűs kivételszavak (ritka kötőjellel, de biztos ami biztos)
- if (in_array($lower, $kisbetus_szavak, true)) {
- $norm[] = $lower;
- continue;
- }
- // 2) teljes mozaikszó: hagyjuk
- if ($is_all_caps($p) || in_array($upper, $mozaikszavak, true)) {
- $norm[] = $upper;
- continue;
- }
- // 3) többszörös tulajdonnév-lánc (pl. Jász-Nagykun-Szolnok, Kerpel-Fronius):
- // ha minden rész "Tulajdon-forma" és egyik sem végződik -i-re, akkor mindet nagy kezdőbetűvel hagyjuk
- $all_look_like_proper = true;
- foreach ($parts as $pp) {
- if ($pp === '') continue;
- if (!preg_match('/^[A-ZÁÉÍÓÖŐÚÜŰ][a-záéíóöőúüű]+$/u', $pp)) { $all_look_like_proper = false; break; }
- }
- if ($all_look_like_proper && !preg_match('/[ií]$/u', $p)) {
- $norm[] = $ucfirst_hu($p);
- continue;
- }
- // 4) ha NEM az első rész ÉS (-i képzős melléknév VAGY tipikus köznév), akkor kis kezdőbetű
- $should_force_lower_initial =
- $i > 0 && (
- preg_match('/[ií]$/u', $lower) ||
- in_array($lower, $koznevi_masodik_tagok, true)
- );
- if ($should_force_lower_initial) {
- // teljes szó kisbetű + vissza, de garantáltan kis kezdőbetű
- $norm[] = mb_strtolower($p);
- continue;
- }
- // 5) alapértelmezés: tulajdonnévszerűre alakítjuk (Nagy kezdő + kis folytatás)
- $norm[] = $ucfirst_hu($p);
- }
- $out .= implode('-', $norm) . $trail;
- continue;
- }
- // nem kötőjeles szó:
- $lower = mb_strtolower($tok);
- $upper = mb_strtoupper($tok);
- if (in_array($lower, $kisbetus_szavak, true)) {
- $out .= $lower . $trail;
- } elseif ($is_all_caps($tok) || in_array($upper, $mozaikszavak, true)) {
- $out .= in_array($upper, $mozaikszavak, true) ? $upper . $trail : $tok . $trail;
- } else {
- // normál "Címforma"
- $out .= $ucfirst_hu($tok) . $trail;
- }
- }
- return $out;
- }
Advertisement
Add Comment
Please, Sign In to add comment