<?php
function silabas($word, $sep = '-') {
    // Convierte la palabra a minúsculas
    $word = mb_strtolower($word, 'UTF-8');
    
    // Definición de categorías de letras
    $l = ['r', 'l'];
    $o = ['p', 'b', 'f', 't', 'd', 'c', 'k', 'g'];
    $c = ['b', 'c', 'ch', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'll', 'm', 'n', 'ñ', 'p', 'q', 'r', 'rr', 's', 't', 'v', 'x', 'y', 'z'];
    $a = ['a', 'e', 'o', 'á', 'é', 'ó', 'í', 'ú'];
    $i = ['i', 'u', 'ü'];
    
    // Inicialización de variables
    $letras = [];
    $estructura = '';
    $j = 0;
    
    // Primera parte: Construcción de letras y estructura
    while ($j < mb_strlen($word, 'UTF-8')) {
        if ($j == 0) {
            if (mb_substr($word, $j, 1, 'UTF-8') == 'p' && mb_substr($word, $j + 1, 1, 'UTF-8') == 's') {
                $letras[] = 'ps';
                $estructura .= 'C';
                $j += 2;
                continue;
            } elseif (mb_substr($word, $j, 1, 'UTF-8') == 'p' && mb_substr($word, $j + 1, 1, 'UTF-8') == 'n') {
                $letras[] = 'pn';
                $estructura .= 'C';
                $j += 2;
                continue;
            } elseif (mb_substr($word, $j, 1, 'UTF-8') == 'p' && mb_substr($word, $j + 1, 1, 'UTF-8') == 't') {
                $letras[] = 'pt';
                $estructura .= 'C';
                $j += 2;
                continue;
            } elseif (mb_substr($word, $j, 1, 'UTF-8') == 'g' && mb_substr($word, $j + 1, 1, 'UTF-8') == 'n') {
                $letras[] = 'gn';
                $estructura .= 'C';
                $j += 2;
                continue;
            }
        }
        if ($j < mb_strlen($word, 'UTF-8') - 1) {
            if (mb_substr($word, $j, 1, 'UTF-8') == 'c' && mb_substr($word, $j + 1, 1, 'UTF-8') == 'h') {
                $letras[] = 'ch';
                $estructura .= 'C';
                $j += 2;
                continue;
            } elseif (mb_substr($word, $j, 1, 'UTF-8') == 'l' && mb_substr($word, $j + 1, 1, 'UTF-8') == 'l') {
                $letras[] = 'll';
                $estructura .= 'C';
                $j += 2;
                continue;
            } elseif (mb_substr($word, $j, 1, 'UTF-8') == 'r' && mb_substr($word, $j + 1, 1, 'UTF-8') == 'r') {
                $letras[] = 'rr';
                $estructura .= 'C';
                $j += 2;
                continue;
            }
        }
        $char = mb_substr($word, $j, 1, 'UTF-8');
        if (in_array($char, $a)) {
            $letras[] = $char;
            $estructura .= 'A';
            $j += 1;
            continue;
        } elseif (in_array($char, $i)) {
            $letras[] = $char;
            $estructura .= 'I';
            $j += 1;
            continue;
        } elseif (in_array($char, $l)) {
            $letras[] = $char;
            $estructura .= 'L';
            $j += 1;
            continue;
        } elseif (in_array($char, $o)) {
            $letras[] = $char;
            $estructura .= 'O';
            $j += 1;
            continue;
        } elseif (in_array($char, $c)) {
            $letras[] = $char;
            $estructura .= 'C';
            $j += 1;
            continue;
        } else {
            throw new Exception("No se reconoce el carácter '$char' como una letra del castellano.");
        }
    }
    $estructura .= 'C';
    $letras[] = '';
    
    // Segunda parte: Separación en sílabas
    $salida = [];
    $j = 0;
    $silaba = '';
    while ($j < count($letras)) {
        if ($letras[$j] == '') {
            break;
        }
        $silaba .= $letras[$j];
        if ($estructura[$j] == 'A') {
            if ($estructura[$j + 1] == 'A') {
                $salida[] = $silaba;
                $silaba = '';
                $j += 1;
                continue;
            } elseif ($estructura[$j + 1] == 'I') {
                $j += 1;
                continue;
            } elseif ($estructura[$j + 1] == 'O') {
                if (in_array($estructura[$j + 2], ['A', 'I', 'L'])) {
                    if ($letras[$j + 1] == 'd' && $letras[$j + 2] == 'l') {
                        $salida[] = $silaba . $letras[$j + 1];
                        $silaba = '';
                        $j += 2;
                        continue;
                    }
                    $salida[] = $silaba;
                    $silaba = '';
                    $j += 1;
                    continue;
                } else {
                    if ($letras[$j + 2] == 's' && in_array($estructura[$j + 3], ['L', 'C', 'O'])) {
                        $salida[] = $silaba . $letras[$j + 1] . $letras[$j + 2];
                        $silaba = '';
                        $j += 3;
                        continue;
                    }
                    $salida[] = $silaba . $letras[$j + 1];
                    $silaba = '';
                    $j += 2;
                    continue;
                }
            } else {
                if ($j + 2 < count($letras)) {
                    if (in_array($estructura[$j + 2], ['A', 'I'])) {
                        $salida[] = $silaba;
                        $silaba = '';
                        $j += 1;
                        continue;
                    } else {
                        if ($letras[$j + 2] == 's' && in_array($estructura[$j + 3], ['L', 'C', 'O'])) {
                            $salida[] = $silaba . $letras[$j + 1] . $letras[$j + 2];
                            $silaba = '';
                            $j += 3;
                            continue;
                        }
                        $salida[] = $silaba . $letras[$j + 1];
                        $silaba = '';
                        $j += 2;
                        continue;
                    }
                } else {
                    $salida[] = $silaba . $letras[$j + 1];
                    $silaba = '';
                    $j += 2;
                    continue;
                }
            }
        } elseif ($estructura[$j] == 'I') {
            if (in_array($estructura[$j + 1], ['A', 'I'])) {
                $j += 1;
                continue;
            } elseif ($estructura[$j + 1] == 'O') {
                if (in_array($estructura[$j + 2], ['A', 'I', 'L'])) {
                    if ($letras[$j + 1] == 'd' && $letras[$j + 2] == 'l') {
                        $salida[] = $silaba . $letras[$j + 1];
                        $silaba = '';
                        $j += 2;
                        continue;
                    }
                    $salida[] = $silaba;
                    $silaba = '';
                    $j += 1;
                    continue;
                } else {
                    if ($letras[$j + 2] == 's' && in_array($estructura[$j + 3], ['L', 'C', 'O'])) {
                        $salida[] = $silaba . $letras[$j + 1] . $letras[$j + 2];
                        $silaba = '';
                        $j += 3;
                        continue;
                    }
                    $salida[] = $silaba . $letras[$j + 1];
                    $silaba = '';
                    $j += 2;
                    continue;
                }
            } else {
                if ($j + 2 < count($letras)) {
                    if (in_array($estructura[$j + 2], ['A', 'I'])) {
                        $salida[] = $silaba;
                        $silaba = '';
                        $j += 1;
                        continue;
                    } else {
                        if ($letras[$j + 2] == 's' && in_array($estructura[$j + 3], ['L', 'C', 'O'])) {
                            $salida[] = $silaba . $letras[$j + 1] . $letras[$j + 2];
                            $silaba = '';
                            $j += 3;
                            continue;
                        }
                        $salida[] = $silaba . $letras[$j + 1];
                        $silaba = '';
                        $j += 2;
                        continue;
                    }
                } else {
                    $salida[] = $silaba . $letras[$j + 1];
                    $silaba = '';
                    $j += 2;
                    continue;
                }
            }
        } elseif ($estructura[$j] == 'O') {
            if (in_array($estructura[$j + 1], ['A', 'I', 'L'])) {
                $j += 1;
                continue;
            } else {
                if ($letras[$j + 1] == '') {
                    $salida[] = $silaba;
                    break;
                }
                throw new Exception("Estructura de sílaba incorrecta en la palabra $word");
            }
        } else {
            if (in_array($estructura[$j + 1], ['A', 'I'])) {
                $j += 1;
                continue;
            } else {
                if ($letras[$j + 1] == '') {
                    $salida[] = $silaba;
                    break;
                } elseif ($letras[$j + 1] == 's') {
                    $salida[] = $silaba;
                    $silaba = '';
                    $j += 1;
                    continue;
                }
                throw new Exception("Estructura de sílaba incorrecta en la palabra $word");
            }
        }
    }
    
    // Une las sílabas con el separador especificado
    return implode($sep, $salida);
}
    // Lista de palabras de prueba
$palabras = [
    "electroencefalografiquísimamente" => "e-lec-tro-en-ce-fa-lo-gra-fi-quí-si-ma-men-te",
    "neurorreflejoterapiquísimamente" => "neu-ro-rre-fle-jo-te-ra-pi-quí-si-ma-men-te",
    "hispanonorteamericanísimamente" => "his-pa-no-nor-te-a-me-ri-ca-ní-si-ma-men-te",
    "instituto" => "ins-ti-tu-to",
    "reunir" => "reu-nir",
    "deshacer" => "des-ha-cer",
    "casa" => "ca-sa",
    "aire" => "ai-re",
    "caos" => "ca-os",
    "guai" => "guai",
    "ahí" => "a-hí",
    "prohibir" => "pro-hi-bir",
    "guion" => "guion",
    "alcohol" => "al-co-hol",
    "rehúso" => "re-hú-so",
    "aéreo" => "a-é-re-o",
    "buey" => "buey",
    "ciudad" => "ciu-dad",
    "héroe" => "hé-ro-e",
    "bioquímica" => "bio-quí-mi-ca",
    "paraguas" => "pa-ra-guas",
    "zoológico" => "zo-o-ló-gi-co",
    "poeta" => "po-e-ta",
    "teoría" => "te-o-rí-a",
    "radiante" => "ra-dian-te",
    "inmueble" => "in-mue-ble",
    "desahucio" => "de-sa-hu-cio",
    "oír" => "o-ír",
    "construir" => "cons-truir",
    "vehículo" => "ve-hí-cu-lo",
    "pingüino" => "pin-güi-no",
    "ahínco" => "a-hín-co"
];
// Función para comprobar las separaciones silábicas
function comprobarSilabas($array_palabras) {
    $resultados = [];
    
    foreach ($array_palabras as $palabra => $silabas_esperadas) {
        // Llamamos a la función silabas() para obtener la separación
        $silabas_obtenidas = silabas($palabra, '-');
        
        // Comparamos el resultado con el valor esperado en el array
        if ($silabas_obtenidas === $silabas_esperadas) {
            $resultados[$palabra] = "Correcto: $silabas_obtenidas coincide con $silabas_esperadas";
        } else {
            $resultados[$palabra] = "Incorrecto: $silabas_obtenidas no coincide con $silabas_esperadas";
        }
    }
    
    return $resultados;
}
// Ejemplo de uso (asumiendo que silabificarBasico() existe)
$resultados = comprobarSilabas($palabras);
// Imprimir resultados
foreach ($resultados as $palabra => $resultado) {
    echo "$palabra - $resultado". "\n";
}
 
  |