| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

24-11-2009, 01:09
|
|
jandayne
Registrierter Benutzer
|
|
Registriert seit: May 2003
Beiträge: 104
|
|
2. und folgende Buchstaben im String klein, wenn groß
Hallo Zusammen,
Gibt es eine Funktion die es mir erlaubt folgenden String so zu formatieren, dass falls der 2. und die folgenden Buchstaben eines Wortes groß geschrieben wurden, dann klein schreibt und den 1. groß, falls aber der 1. und die folgenden Buchstaben klein sind, diese nicht verändert.
Sprich:
"HALLO DAS IST EIN TEST" = "Hallo Das Ist Ein Test"
"Hallo das ist ein Test" = "Hallo das ist ein Test"
Klar sind mir die Funktionen wie mb_strtoupper(), mb_strtolower(), ucwords() usw. bekannt. Diese wandeln ja aber eben immer nur stur alles um und machen keine unterscheidung.
Wahrscheinlich muss ich mir hier eine eigene Funktion basteln, oder? Hat hier Jemand einen anstoß zur realisierung?
Oder hat Jemand eine andere Idee wie man damit umgeht. Ich möchte lediglich ein Einheitliches Bild in einem Kalender schaffen ohne das bestimmte Events durch Großschreibung hervorgehoben werden.
Vielen herzlichen Dank
Gruß Jan
|

24-11-2009, 01:28
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Hallo,
PHP-Code:
<?php mb_internal_encoding("utf-8"); $text = "HALLO, DAS IST EIN äÖÜß TEST, Hallo, das ist ein Äöüß Test."; $pieces = preg_split("/(\\PL+)/u", $text, -1, PREG_SPLIT_DELIM_CAPTURE); for ($i = 0; $i < count($pieces); $i += 2) { if (strlen($pieces[$i])) { $pieces[$i] = mb_substr($pieces[$i], 0, 1) . mb_strtolower(mb_substr($pieces[$i], 1)); } } $text = implode("", $pieces); // "Hallo, Das Ist Ein äöüß Test, Hallo, das ist ein Äöüß Test." ?>
Gruß,
Amica
Geändert von AmicaNoctis (24-11-2009 um 01:38 Uhr)
Grund: Code war nicht multibyte safe, jetzt ist er's
|

24-11-2009, 14:09
|
|
jandayne
Registrierter Benutzer
|
|
Registriert seit: May 2003
Beiträge: 104
|
|
Hallo Amica,
vielen herzlichen Dank für deine Antwort. Dein Code hat mich auf jeden Fall weiter gebracht. Allerdings hat dieser nicht sofort bei mir geklappt.
Ich habe diesen jetzt wie folgt geändert und jetzt funktioniert er. Kann ich das so lassen?:
PHP-Code:
<?php
mb_internal_encoding("ISO-8859-15");
$text = "HALLO, DAS IST EIN äÖÜß TEST, Hallo, das ist ein Äöüß Test.";
$pieces = preg_split("/ /", $text, -1, PREG_SPLIT_DELIM_CAPTURE);
for ($i = 0; $i < count($pieces); $i++) {
if (strlen($pieces[$i])) {
$pieces[$i] = mb_substr($pieces[$i], 0, 1) . mb_strtolower(mb_substr($pieces[$i], 1));
}
}
$text = implode(" ", $pieces); // "Hallo, Das Ist Ein äöüß Test, Hallo, das ist ein Äöüß Test."
echo $text;
?>
|

24-11-2009, 14:16
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Eigentlich war der Code schon so in Ordnung. Wenn er nicht funktioniert haben sollte, liegt das vermutlich entweder an einer veralteten PHP Version oder dem falschen Zeichensatz. Deine Änderungen ergeben nicht alle einen Sinn. Insbesondere der RegEx nicht mehr und das $i++ auch nicht. Was genau hat denn an der ersten Version nicht funktioniert?
Edit: achso, sorry, dass $i++ macht in der Form schon Sinn, aber nur, weil im RegEx jetzt die Klammern fehlen
|

24-11-2009, 20:03
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von jandayne
...
Sprich:
"HALLO DAS IST EIN TEST" = "Hallo Das Ist Ein Test"
"Hallo das ist ein Test" = "Hallo das ist ein Test"
...
Ich möchte lediglich ein Einheitliches Bild in einem Kalender schaffen ohne das bestimmte Events durch Großschreibung hervorgehoben werden.
|
Damit verunstaltest du aber beispielsweise römische Zahlzeichen.
Die kommen in Kalendern schon mal vor:
" 19. April 2005: Amtseinführung Pabst Benedikt des XVI."
*edit*
Mist, der konstruktive Teil dieses Posts ist in der Erstversion irgendwie abhanden gekommen. Daher etwas verspätet, hier eine Papst-taugliche Variante:
PHP-Code:
preg_replace_callback(
'/(?![IVXLCDM]+\P{L})(?:\p{Lu}|(\p{Ll}))\p{L}+/u',
create_function(
'$h',
'return mb_convert_case($h[0], isset($h[1]) ? MB_CASE_LOWER : MB_CASE_TITLE);'
),
$text
);
Eigentlich wäre das ein One-Liner, aber da nicht umbrochener Quelltext hier nicht so gern gesehen ist, hab ich das mal auf 8 Zeilen verteilt. ;-)
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
Geändert von fireweasel (25-11-2009 um 00:15 Uhr)
|

24-11-2009, 21:09
|
|
Floern
Registrierter Benutzer
|
|
Registriert seit: Nov 2009
Ort: Schweiz
Beiträge: 8
|
|
n'Abend,
Zitat:
Zitat von fireweasel
Damit verunstaltest du aber beispielsweise römische Zahlzeichen.
Die kommen in Kalendern schon mal vor:
" 19. April 2005: Amtseinführung Pabst Benedikt des XVI."
|
Das könnte man eigentlich simpel umgehen, indem man folgendes an den Anfang der for-Schleife schreibt:
PHP-Code:
if(preg_match('#^[IVXLCDM]+$#', $pieces[$i])) continue;
Könnte man natürlich auch noch genauer machen.
|

24-11-2009, 21:13
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Guter Einwand! Danke! Korrektur hier:
PHP-Code:
<?php mb_internal_encoding("utf-8"); $text = "HALLO, DAS IST EIN äÖÜß TEST, Hallo, das ist ein Äöüß Test."; $pieces = preg_split("/(\\PL+)/u", $text, -1, PREG_SPLIT_DELIM_CAPTURE); $roman = "/^M{0,4}((C[MD])|(D?C{0,3}))((X[CL])|(L?X{0,3}))((I[XV])|(V?I{0,3}))$/"; for ($i = 0; $i < count($pieces); $i += 2) { if (strlen($pieces[$i]) && !preg_match($roman, $pieces[$i])) { $pieces[$i] = mb_substr($pieces[$i], 0, 1) . mb_strtolower(mb_substr($pieces[$i], 1)); } } $text = implode("", $pieces); echo($text); ?>
Wenn, dann richtig
Geändert von AmicaNoctis (24-11-2009 um 21:28 Uhr)
|

24-11-2009, 21:33
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Und was ist mit Abkürzungen? PHP, MySQL, HTML, OSX, PS3, JPG, EU, USA, ARD, ZDF, UStG, PKW, DVD, XP, usw.
|

24-11-2009, 21:34
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Recht hast du, aber darauf hab ich jetzt keinen Bock mehr. Soll sich der TO selbst drum kümmern
|

25-11-2009, 00:12
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von h3ll
Und was ist mit Abkürzungen? PHP, MySQL, HTML, OSX, PS3, JPG, EU, USA, ARD, ZDF, UStG, PKW, DVD, XP, usw.
|
Nicht zu vergessen: BenQ, eBay, BahnCard ...
Das sind alles Wörter, die in Kalendern praktisch nicht zu finden sind, daher kann man sie ignorieren.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
|

25-11-2009, 07:27
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Für dieses Buchstabenproblem kann es keine perfekte Lösung geben. Man kann eine finden, die viel erschlägt, aber niemals alles. Denn in unserer Sprache können Abkürzungen und Eigennamen (mit Großbuchstaben) beliebig gebildet werden, d.h. es gibt endlos viele und keinen Algorithmus, der alle erzeugt.
Statt selbst eine Näherungslösung zu entwickeln, würde ich einfach bestehende nutzen - PHP: Pspell - Manual.
|

25-11-2009, 09:21
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
Das Problem schreit nach einer biologischen Komponente!
(Festanstellung)
|

25-11-2009, 10:13
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von fireweasel
Nicht zu vergessen: BenQ, eBay, BahnCard ...
Das sind alles Wörter, die in Kalendern praktisch nicht zu finden sind, daher kann man sie ignorieren. 
|
Kommt auf den Kalender an. Man kann in Kalendern auch PHP-Konferenzen eintragen, usw.
|

25-11-2009, 22:44
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von h3ll
Zitat:
Zitat von fireweasel
Nicht zu vergessen: BenQ, eBay, BahnCard ...
Das sind alles Wörter, die in Kalendern praktisch nicht zu finden sind, daher kann man sie ignorieren. 
|
Kommt auf den Kalender an. Man kann in Kalendern auch PHP-Konferenzen eintragen, usw.
|
OffTopic:
Aber sicher doch. Deswegen hatte ich auch den Smiley mit dem zugekniffenen Auge hinter meine Aussage gesetzt. Wobei ich nie freiwillig auf PHP-Konferenzen gehen würde, höchstens gegen Bezahlung und dann auch nur, wenn man dort Bullshit-Bingo spielen dürfte ... 
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|