php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Scripts > Apps und PHP Script Gesuche
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


Apps und PHP Script Gesuche Hier könnt ihr nach PHP Skripten und Programmen fragen. Postet eure Wünsche

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 29-08-2012, 12:49
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard [PHP] Multibyte-taugliches wordwrap?

Hallo,

hat jemand einen Schnipsel parat, der die Funktionalität von wordwrap() umsetzt und dabei Multibyte-Strings verlässlich UND halbwegs performant bearbeitet?

Jedes Schnipsel das ich bis jetzt auf php.net oder stackoverflow.com gefunden hab, hat entweder nicht zuverlässig gearbeitet oder aber schon für kurze Strings ein paar Sekunden gebraucht!
__________________
Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
Schön - etwas Geschichte kann ja nicht schaden.
Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!
Mit Zitat antworten
  #2 (permalink)  
Alt 29-08-2012, 20:08
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo,

meinst du UTF-8 oder andere UTFs? Bei UTF-8 kannst du das eingebaut wordwrap verwenden, da der Byte code 0x20 nicht in anderen Sequenzen vorkommen darf, zumindest nicht in gültigen. Aus ungültigen Sequenzen könnten also schlimmstenfalls andere ungültige Sequenzen werden. Ob das ein Sicherheitsrisiko darstellt, musst du kontextabhängig entscheiden.

Bei den UTF-16/32-BE/LE-Codierungen kannst du dir auch mit explode was selber basteln oder den String mit for durchrattern (letzteres sollte schneller gehen als Array-Operationen). Du musst an sich nur die Byte Order erkennen und entsprechend kannst du dann auch nach 0x0020, 0x2000, 0x00000020 oder 0x20000000 suchen.

Gruß,

Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #3 (permalink)  
Alt 29-08-2012, 20:13
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Bei UTF-8 kannst du das eingebaut wordwrap verwenden, da […]
Wenn es nur um das Ersetzen von Leerzeichen durch Umbrüche geht, vielleicht. (Dazu bräuchte man es aber nur in Sonderfällen, denn an Leerzeichen umbrechen kann HTML gut selber*.)

Aber wordwrap kann auch innerhalb eines zu langen Wortes Umbrüche erzwingen – und da wird’s bei Mehrbyte-Kodierungen schnell haarig …


* btw, wenn man’s nur dafür braucht, dass zu lange Wörter im Browser umgebrochen werden – da kann man m.E. besser die CSS-Eigenschaft word-wrap:break-word für benutzen.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #4 (permalink)  
Alt 29-08-2012, 20:17
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Okay, das ist aber auch in UTF-8 mit einer einzigen Bedingung abgehandelt: Es darf nie ein Umbruch vor einem Byte aus dem Bereich 0x80 bis 0xbf (beides inklusive) eingefügt werden. Alles andere ist erlaubt. In den anderen UTFs ist es wegen der gleichen Bytelänge der Zeichen noch simpler.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #5 (permalink)  
Alt 29-08-2012, 20:22
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Hallo AmicaNoctis,

Es geht tatsächlich nur um UTF8-Strings. Das eingebaute wordwrap versagt bei mir allerdings sobald Zeichen in String vorkommen, die mehr als ein Byte belegen. Hier wird der String dann jeweils zu früh umgebrochen.

PHP-Code:
mb_internal_encoding("UTF-8");
header'content-type: text/plain; charset=utf-8' );

$str "Etwas Text - mal ein e-Zeichen und wieder etwas Text";
echo 
wordwrap($str30); 
bricht nach "e-Zeichen" um.

PHP-Code:
mb_internal_encoding("UTF-8");
header'content-type: text/plain; charset=utf-8' );

$str "Etwas Text - mal ein €-Zeichen und wieder etwas Text";
echo 
wordwrap($str30); 
bricht nach "mal ein" um.


EDIT:
@wahsaga
Den vierten Parameter von wordwrap verwende ich nicht. Es soll also nur zwischen zwei Wörtern umgebrochen werden.
Verwendet wird es für Plain-Text-Mails. Die Mails werden mit SwiftMailer erstellt - jedoch versagt auch hier die eingebaute Funktion, die die Mail auf maximale Zeilenlänge von 78-Zeichen beschränken soll.


Nochmal Edit:
Getestet unter 5.3.9 und 5.2.13
__________________
Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
Schön - etwas Geschichte kann ja nicht schaden.
Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

Geändert von Quetschi (29-08-2012 um 20:37 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 29-08-2012, 20:38
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.576
h3ll befindet sich auf einem aufstrebenden Ast
Standard

UTF-8 Wordwrap | Milian Wolff
Mit Zitat antworten
  #7 (permalink)  
Alt 29-08-2012, 21:07
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

@h3ll

Das Snippet hatte ich auch schon gefunden - aber irgendwas hat da nicht gepasst.

Ich schau es mir aber nochmal in Ruhe an.
__________________
Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
Schön - etwas Geschichte kann ja nicht schaden.
Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!
Mit Zitat antworten
  #8 (permalink)  
Alt 29-08-2012, 21:10
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.576
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Darf ich fragen, wofür man das braucht?
Mit Zitat antworten
  #9 (permalink)  
Alt 29-08-2012, 21:35
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

@h3ll

Hatte es in Post#5 schon im Edit geschrieben:
Zitat:
Verwendet wird es für Plain-Text-Mails. Die Mails werden mit SwiftMailer erstellt - jedoch versagt auch hier die eingebaute Funktion, die die Mail auf maximale Zeilenlänge von 78-Zeichen beschränken soll.
__________________
Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
Schön - etwas Geschichte kann ja nicht schaden.
Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

Geändert von Quetschi (29-08-2012 um 21:38 Uhr)
Mit Zitat antworten
  #10 (permalink)  
Alt 29-08-2012, 21:48
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

@h3ll

Die von dir verlinkte Funktion versagt leider auch bei diversen Strings.
__________________
Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
Schön - etwas Geschichte kann ja nicht schaden.
Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!
Mit Zitat antworten
  #11 (permalink)  
Alt 29-08-2012, 21:57
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.576
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zend_Text_MultiByte::wordWrap()
Mit Zitat antworten
  #12 (permalink)  
Alt 29-08-2012, 22:26
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Quetschi Beitrag anzeigen
PHP-Code:
$str "Etwas Text - mal ein e-Zeichen und wieder etwas Text";
echo 
wordwrap($str30); 
bricht nach "e-Zeichen" um.

PHP-Code:
$str "Etwas Text - mal ein €-Zeichen und wieder etwas Text";
echo 
wordwrap($str30); 
bricht nach "mal ein" um.
Mein hingehackter Versuch:
PHP-Code:
function wordwrap_utf8_primitive($str$length$break) {
  
$parts explode(' '$str);
  
$return = array('');
  
$i 0;
  foreach(
$parts as $word) {
    if(
mb_strlen($return[$i], 'UTF-8') + mb_strlen($word'UTF-8') <= $length) {
      
$return[$i] .= $word ' ';
    }
    else {
      
$return[$i] = rtrim($return[$i]); // letztes Leerzeichen wieder entfernen
      
$return[++$i] = $word ' ';
    }
  }
  return 
rtrim(join($break$return));
}

$str "Etwas Text - mal ein e-Zeichen und wieder etwas Text";
echo 
wordwrap_utf8_primitive($str30'<br>');  

$str "Etwas Text - mal ein €-Zeichen und wieder etwas Text";
echo 
wordwrap_utf8_primitive($str30'<br>');

// Ausgabe:

// Etwas Text - mal ein e-Zeichen
// und wieder etwas Text

// Etwas Text - mal ein €-Zeichen
// und wieder etwas Text 
Geht sicherlich eleganter, aber tut für den präsentierten Testfall erst mal was es soll.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #13 (permalink)  
Alt 29-08-2012, 23:55
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Zitat:
Zitat von h3ll Beitrag anzeigen
Zend_Text_MultiByte::wordWrap()
Hatte ich mir ebenfalls schon geholt und versagt ebenso in einigen Fällen. Die Google-Suche bringt da auch einiges zum Vorschein.

@wahsaga
So einen Ansatz hatte ich auch schon im Kopf - teste ich morgen - für heut reichts mir :-)

Thank you very much!

Edit:
Wenn im Ausgangstext ein Zeilenumbruch vorkommt, macht die Funktion danach evtl. nicht richtig weiter, oder? Schau ich mir morgen an - da kann man ja noch entsprechend drauf reagieren.
__________________
Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
Schön - etwas Geschichte kann ja nicht schaden.
Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

Geändert von Quetschi (29-08-2012 um 23:59 Uhr)
Mit Zitat antworten
  #14 (permalink)  
Alt 30-08-2012, 10:54
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Quetschi Beitrag anzeigen
Wenn im Ausgangstext ein Zeilenumbruch vorkommt, macht die Funktion danach evtl. nicht richtig weiter, oder?
Natürlich nicht – sie hat aus gutem Grund “primitive” im Namen :-)

Wobei man erst mal definieren müsste, wie die Funktion darauf reagieren soll, bzw. schauen, wie das originale wordwrap das macht (und ob das das gewünschte Verhalten ist).

Vielleicht wäre es sinnvoll, den Eingabetext erst mal in Zeilen aufzusplitten – und jede von denen dann einzeln zu behandeln. Das ergibt auch von der Logik her vermutlich den meisten Sinn – innerhalb von Zeilen wird bei Länge x umgebrochen; schon bestehende Umbrüche werden aber so übernommen, wie sie sind.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #15 (permalink)  
Alt 30-08-2012, 11:17
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Zitat:
Zitat von wahsaga Beitrag anzeigen
...sie hat aus gutem Grund “primitive” im Namen :-)
Aufgrund des Verfassers des Scripts?


__________________
Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
Schön - etwas Geschichte kann ja nicht schaden.
Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
wordwrap Problem brauni54 PHP Developer Forum 2 04-09-2005 13:13
nl2br und wordwrap alexs PHP Developer Forum 3 08-08-2004 20:32
wordwrap Gismo PHP Developer Forum 1 04-09-2003 20:54
In preg_replace wordwrap ausführen Sebastian W PHP Developer Forum 6 01-04-2003 17:16
wordwrap funktion dESIGN PHP Developer Forum 3 16-01-2002 14:18

Themen-Optionen
Thema bewerten
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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 10:30 Uhr.