<?php

/*******************************************************************************
* Software: Silbentrenner                                                      *
* Version:  1.0                                                                *
* Date:     2008-12-03                                                         *
* Author:   Tim Böttiger, http://www.phpblogger.net/                           *
* License:  Freeware                                                           *
*                                                                              *
* You may use and modify this software as you wish.                            *
*******************************************************************************/

function countVokale($silbe)
{
    
$vokale= array("a""ä""e""i""o""ö""u""ü");
    
$count0;
    
    foreach(
$vokale as $vokal)
        
$count+= substr_count(strtolower($silbe), $vokal);
    
    return 
$count;
}

function 
getSilben($wort)
{
    
$silben= array();
    
$vokale= array("a""ä""e""i""o""ö""u""ü");
    
$nicht_trennbar= array("ck""ch""sch""en""er""es""ei""au""eu""sp""pf""ft""nt""ts");
    
    
$konsonanten_zwischenspeicher= array();
    for(
$buchstabe0$buchstabe strlen($wort); $buchstabe++)
    {
        if(
in_array(strtolower($wort[$buchstabe]), $vokale))
        {
            if(
count($konsonanten_zwischenspeicher) == 0)
            {
                if(
countVokale($silben[count($silben) -1]) >= 2)
                {
                    
// Wenn in der letzten Silbe bereits 2 Vokale enthalten sind, muss der aktuelle Vokal erstmal alleine stehen.
                    
$silben[]= $wort[$buchstabe];
                }
                else if(
count($silben) ->= 0)
                {
                    
$zeichen_laenge1;
                    foreach(
$nicht_trennbar as $zeichen)
                    {
                        
// Wenn das Vokal und die nachfolgenden Zeichen mit den nicht trennbaren Zeichen übereinstimmen, diese extrahieren
                        
$zeichen_zusammenfassungimplode(""array_slice(preg_split('//'$wort, -1PREG_SPLIT_NO_EMPTY), $buchstabestrlen($zeichen)));
                        if(
strtolower($zeichen_zusammenfassung) == $zeichen)
                        {
                            
$zeichen_laengestrlen($zeichen);
                            break;
                        }
                    }
                    
                    if(
$zeichen_laenge == 1$zeichen_zusammenfassung$wort[$buchstabe];

                    
// Einzelne Vokale (ohne Pre-Konsonanten) an letzte Silbe anhängen
                    // (In einer Silbe können max 2 Vokale vorkommen)
                    
if(countVokale($silben[count($silben) -1] . $zeichen_zusammenfassung) > 2$silben[].= $zeichen_zusammenfassung;
                    else 
$silben[count($silben) -1].= $zeichen_zusammenfassung;

                    
// die extrahierten Zeichen überspringen, um Doppler zu vermeiden
                    
$buchstabe+= ($zeichen_laenge -1);

                }
                else
                {
                    
// Wenn es keine erste Silbe gibt, wird eine neue erstellt
                    
$silben[]= $wort[$buchstabe];
                }
            }
            else if(
count($konsonanten_zwischenspeicher) > 1)
            {
                if(
count($silben) ->= 0)
                {
                    
$zeichen_laenge1;
                    
// Nichttrennbare Zeichenfolgen checken:
                    
foreach($nicht_trennbar as $zeichen)
                    {
                        if(
substr(strtolower(implode(""$konsonanten_zwischenspeicher)), 0strlen($zeichen)) == $zeichen)
                        {
                            
$zeichen_laengestrlen($zeichen);
                            break;
                        }
                    }

                    
// Wenn untrennbare Zeichen gefunden, zur Vorsilbe hinzuziehen:
                    // Wenn nicht nur 1. Zeichen
                    
for($pos0$pos $zeichen_laenge$pos++)
                        
$silben[count($silben) -1].= array_shift($konsonanten_zwischenspeicher);
                }
                
                if(
count($konsonanten_zwischenspeicher) > 0)
                {
                    
// Der Rest bildet eine eigene Silbe
                    
$silben[]= implode(""$konsonanten_zwischenspeicher) . $wort[$buchstabe];
                }
                else
                {
                    
// Wenn keine Konsonanten mehr da sind, wird der Vokal auch an die letzte Silbe angehängt
                    
$silben[count($silben) -1].= $wort[$buchstabe];
                }
            }
            else
            {
                
$zeichen_laenge1;
                foreach(
$nicht_trennbar as $zeichen)
                {
                    
// Wenn das Vokal und die nachfolgenden Zeichen mit den nicht trennbaren Zeichen übereinstimmen, diese extrahieren
                    
$zeichen_zusammenfassungimplode(""array_slice(preg_split('//'$wort, -1PREG_SPLIT_NO_EMPTY), $buchstabestrlen($zeichen)));
                    if(
strtolower($zeichen_zusammenfassung) == $zeichen)
                    {
                        
$zeichen_laengestrlen($zeichen);
                        break;
                    }
                }
                
                if(
$zeichen_laenge == 1$zeichen_zusammenfassung$wort[$buchstabe];

                
// Sonst: Alle gesammelten Konsonanten und das Vokal anhängen:
                
$silben[]= implode(""$konsonanten_zwischenspeicher) . $zeichen_zusammenfassung;
                
// die extrahierten Zeichen überspringen, um Doppler zu vermeiden
                
$buchstabe+= ($zeichen_laenge -1);
            }
            
$konsonanten_zwischenspeicher= array();
        }
        else
        {
            
// Erst mal die Konsonanten zwischenspeichern
            
$konsonanten_zwischenspeicher[]= $wort[$buchstabe];
        }
    }
    
// Letzte Konsonanten sind keine eigne Silbe
    
$silben[count($silben) -1].= implode(""$konsonanten_zwischenspeicher);
    
    
// Konnte das Wort nicht getrennt werden?
    
if(count($silben) == 0$silben[]= $wort;
    
    return 
$silben;
}

print_r(getSilben("Schlager"));


?>