Leerzeichen zwischen Worte einfügen?
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
code
doppel
ecke
ersetzung
erweitern
fehlen
fehler
fragezeichen
helm
hut
punkt
satz
satzzeichen
text
umwandeln
url
vier
wort
zahl
-
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!
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
digg schrieb:
in etwa so:
... (mit PHP) den Text so umwandeln, ...<?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!] -
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.
-
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);
-
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); ?>
-
fatfreddy schrieb:
:) ja das ist auch nicht behauptet worden. die lösung deckt genau das ab, was er verlangt hat.
Perfekt ist die Lösung aber nicht ...
trueweb schrieb:
was ja aus meinem vorschlag herausdividiert worden ist (arrays ansehen ;)$text = str_replace(array(".", ",", ";", "?", "!", ":"), array(". ", ", ", "; ", "? ", "! ", ": "), $text);
$text = str_replace(" ", " ", $text);
hackyourlife schrieb:
das meistert deine lösung nicht.
...<?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; ...
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 :) -
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 \
-
digg schrieb:
Weil das trotzdem ein String bleibt, in dem ganz normal escaped werden muss... und bei
und warum ist es doppel-escaped mit \\ und nicht nur nur mit \
würdest du das auch selbstverständlich machen.echo('\\');
digg schrieb:
Ja, das kannst du machen.
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);
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage