kostenloser Webspace werbefrei: lima-city


Leerzeichen zwischen Worte einfügen?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    digg

    digg hat kostenlosen Webspace.

    Hallo
    ich habe Texte, bei denen manchmal kein Leerzeichen zwischen zwei Worten oder am Satz-Ende ist

    wie kann ich (mit PHP) den Text so umwandeln,
    dass wenn auf einen Klein-Buchstabe oder auf ein Satzzeichen direkt ein Gross-Buchstabe folgt
    dann dazwischen ein Leerzeichen einfügen.

    BSP: Mein Hut der hat vierEcken. ---> Mein Hut der hat vier Ecken.
    BSP: Ist das ein Hut?Oder ein Helm? ---> Ist das ein Hut? Oder ein Helm?
    BSP: Hast Du einen Hut,bist du gut. ---> Hast Du einen Hut, bist du gut.
    usw.

    also immer wenn Großbuchstabe oder Satzzeichen "direkt" auf ein Nicht-Leerzeichen folgt
    dann dazwischen ein Leerzeichen einfügen ... evtl mit einem preg_replace() ... aber wie?

    mit Satzzeichen meine ich: punkt, komma, semikolon, fragezeichen, ausrufezeichen, doppelpunkt ... etc...
    . , ; ? ! :


    PS: Sonderfall wären noch Klammern, also bei ( vorher ein Leerzeichen und bei ) danach

    Danke!
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. digg schrieb:
    ... (mit PHP) den Text so umwandeln, ...
    in etwa so:
    <?php
    // czibere.lima-city.de/_forum/digg/leerzeichen-zwischen-worte-einfuegen/index.php
    // . , ; ? ! :
    
    error_reporting(E_ALL | E_STRICT);
    
    $txt = 'Mein Hut    der hat vierEcken.Ist das ein Hut(Haut)? Oder ein Helm?Hast Du einen Hut,bist du gut.';
    echo "$txt<hr />";
    
    $txt = str_replace(
      array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
            'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'Z', 'X', 'Y', 'Ä', 'Ö',
            'Ü', '.', ',', ';', '?', '!', ':', '(', '( ', ')', '  '),
      array(' A', ' B', ' C', ' D', ' E', ' F', ' G', ' H', ' I', ' J', ' K', ' L', ' M', ' N',
            ' O', ' P', ' Q', ' R', ' S', ' T', ' U', ' V', ' W', ' Z', ' X', ' Y', ' Ä', ' Ö',
            ' Ü', '. ', ', ', '; ', '? ', '! ', ': ', ' (', '(', ') ', ' '),
      $txt
    );
    
    exit(''.$txt);
    wie du aber sehen kannst, bei satzzeichen kan eine konstallation '<space>?' entstehen. also nach dem selben prinzip kannst auch die fälle zum kode hinzufügen :) [vorsicht bei der reihenfolge in den 2 arrays!]
  4. Perfekt ist die Lösung aber nicht.

    Fehlende Leerzeichen sind nicht unbedingt an Großbuchstaben erkennbar.

    - Der Fehler in "In diesem Satz fehltein Leerzeichen." würde nicht erfasst.
    - Abkürzungen, wie "ARD", würden zu "A R D"

    Im zweiten Beispiel ließe sich dadurch umgehen, daß man, vor der Ersetzung, auf mehrere, aufeinanderfolgende Großbuchstaben prüft.
    Das erste Beispiel würde wohl eine umfangreiche Wortliste voraussetzen. Und selbst die würde scheitern, da es durchaus kontextbezogene Unterschiede in der Getrennt-, oder Zusammenschreibung gibt.
  5. t*****b

    Mal ganz blöd gesagt, könnte man doch einfach jedes Satzzeichen so ersätzen:

    $text = str_replace(array(".", ",", ";", "?", "!", ":"), array(". ", ", ", "; ", "? ", "! ", ": "), $text);


    Da man nun jedes Zeichen, egal ob darauf ein Leezreichen folgt oder nicht ersätzt hat, muss man nun noch doppelte Leerzeichen entfernen:

    $text = str_replace("  ", " ", $text);
  6. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Man könnte auch ganz einfach 2 Regex anwenden, dann sind alle Probleme behoben...
    <?php
    
    header('content-type: text/plain');
    
    $text = <<< 'EOT'
    Mein Hut der hat vierEcken. ---> Mein Hut der hat vier Ecken.
    Ist das ein Hut?Oder ein Helm? ---> Ist das ein Hut? Oder ein Helm?
    Hast Du einen Hut,bist du gut. ---> Hast Du einen Hut, bist du gut.
    
    - Abkürzungen, wie "ARD", würden zu "A R D"
    EOT;
    
    $text = preg_replace('/(\\.|,|;|\\?|!|:)([a-zA-Z])/', '\\1 \\2', $text);
    $text = preg_replace('/([a-z])([A-Z])/', '\\1 \\2', $text);
    
    echo($text);
    
    ?>
  7. fatfreddy schrieb:
    Perfekt ist die Lösung aber nicht ...
    :) ja das ist auch nicht behauptet worden. die lösung deckt genau das ab, was er verlangt hat.

    trueweb schrieb:
    $text = str_replace(array(".", ",", ";", "?", "!", ":"), array(". ", ", ", "; ", "? ", "! ", ": "), $text);

    $text = str_replace("  ", " ", $text);
    was ja aus meinem vorschlag herausdividiert worden ist (arrays ansehen ;)

    hackyourlife schrieb:
    ...
    <?php
    ...
    $text = <<< 'EOT'
    Mein Hut    derhat vierEcken. ---> Mein Hut der hat vier Ecken.
    Ist das ein Hut?Oder ein Helm? ---> Ist das ein Hut? Oder ein Helm?
    Hast Du einen Hut,bist du gut. ---> Hast Du einen Hut, bist du gut.
     
    - Abkürzungen, wie "ARD", würden zu "A R D"
    EOT;
    ...
    das meistert deine lösung nicht.

    und wir können die thematik biegen und brechen, php ist kein textbearbeitungs-automat. eine automatische textkorrektur ist mit sicherheit wesentlich komplexer, dass man es mit php und apache effektiv verwirklichen kann. ich würde c(++) nehmen, aber sicher nicht in alleingang.
    mich wunder es immer noch, wo man so verrückten texte herbeiholt :)
  8. Autor dieses Themas

    digg

    digg hat kostenlosen Webspace.

    Hallo
    mir ist schon klar, dass PHP nicht "zaubern" kann, aber auf Webspace habe ich nunmal kein C(++)
    und dass Fehler in Text wie ""In diesem Satz fehltein Leerzeichen." wohl nicht behoben werden können,
    weil wie (ohne Wörterbuch) soll PHP da erkennen, das "fehltein" eigentlich "fehlt ein" heissen soll.
    sowas erwarte ich ja garnicht ...

    Das von hackyourlife sieht ja schon ganz gut aus

    $text = preg_replace('/(\\.|,|;|\\?|!|:)([a-zA-Z])/', '\\1 \\2', $text);
    $text = preg_replace('/([a-z])([A-Z])/', '\\1 \\2', $text);


    frage mich dabei nur, warum .(Punkt) und ? (Fragezeichen) gleich doppelt escaped sind
    ... genügt da nich einmal \ (Backslash) davor ?

    da ein Leerzeichen ja auch nach einer Zahl fehlen kann,
    könnte man doch die Pattern so erweitern : (?)
    $text = preg_replace('/(\\.|,|;|\\?|!|:)([a-zA-Z0-9])/', '\\1 \\2', $text);
    $text = preg_replace('/([a-z0-9])([A-Z])/', '\\1 \\2', $text);


    und warum ist es doppel-escaped mit \\ und nicht nur nur mit \

  9. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    digg schrieb:
    und warum ist es doppel-escaped mit \\ und nicht nur nur mit \
    Weil das trotzdem ein String bleibt, in dem ganz normal escaped werden muss... und bei
    echo('\\');
    würdest du das auch selbstverständlich machen.

    digg schrieb:
    da ein Leerzeichen ja auch nach einer Zahl fehlen kann,
    könnte man doch die Pattern so erweitern : (?)
    $text = preg_replace('/(\\.|,|;|\\?|!|:)([a-zA-Z0-9])/', '\\1 \\2', $text);
    $text = preg_replace('/([a-z0-9])([A-Z])/', '\\1 \\2', $text);
    Ja, das kannst du machen.
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!