str_split()-Alternative
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
alternativ
anwendungsfall
ausdruck
befehl
buchstabe
einsetzt beitrag
falsche fehler
fehlermeldung
funktion
gravierenden nachteil
lngen
mehreren zeilen
paket
parameter
po
schlu
segment
space
variant
vorurteil
-
Hallo...
Ich suche einen Alternativ-Befehl zu "str_split();", da dieser auf meinen Web-Servern deaktiviert ist...
Mit str_split kann man einen String in ein array teilen, wobei jedes Element eine bestimmte L?nge hat... Und genau so einen Befehl sollte ich haben...
Bzw. eine Funktion w?rde auch schon helfen...
Sprich, wie kann ich es machen, dass mir eine Funktion einen kompletten String mit beispielsweise 100 Buchstaben in Segmente mit 20 Buchstaben unterteilt und mir diese als Array zur?ckliefert, damit ich dann diese Segmente mit
echo $segment['0'];
echo $segment['1'];
echo $segment['2'];
echo $segment['3'];
...
ausgeben kann?
W?re super, wenn mir da ein php-checker helfen k?nnte...
MfG
schrotti12 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hi,
wenn du willst, kannst du hier meine Funktion benutzen, sie liefert den genau gleichen Array wie str_split() von PHP 5 zur?ck und ben?tigt die selben Parameter:
if (!function_exists("str_split")) { function str_split($str,$length = 1) { if ($length < 1) return false; $strlen = strlen($str); $ret = array(); for ($i = 0; $i < $strlen; $i += $length) { $ret[] = substr($str,$i,$length); } return $ret; } }
mfg,
hr -
Ich werd das mal ausprobieren...
aber erst morgen...
Danke schonmal f?r die schnelle Antwort...
Das iss echt l?stig, wenn der Server PHP5 noch nicht unterst?zt... -
Solch eine Frage hatten wir doch letztens erst oder?
Da ich nicht wusste, ob Leerzeichen erw?nscht sind, habe ich einfach noch ne kleine Abfrage eingebaut, die die Leerzeichen bei Bedarf l?scht.
<?php $leerzeichen = FALSE; //Sind Leerzeichen erwuenscht? Ja = FALSE, Nein = TRUE //Beliebiger String $string = 'Dies ist ein Test.........!'; //Falls Leerzeichen unerwuenscht, diese loeschen if($leerzeichen) $string = str_replace(' ', '', $string); $laenge = 3; //Laenge der Elemente!? // "\n" nach $laenge Zeichen hinzufuegen $text = wordwrap ($string, $laenge, "\n",1); //String anhand von "\n" trennen und in array einlesen $array = explode("\n", $text); //Ausgabe des Arrays print_r($array); ?>
Kommentare d?rften genug sein oder? Ach hier ist auch die Funktion... -.-
<?php function split_str($string, $length, $space = FALSE) { if($space) $string = str_replace(' ', '', $string); $text = wordwrap ($string, $laenge, "\n",1); return $array = explode("\n", $text); } ?>
Naja, die Funktion erwartet zwei Parameter. Einmal den String und dann noch die L?nger der Elemente. Alternativ kann man auch noch TRUE als dritten Parameter nehmen, wenn man will, dass die Leerzeichen gel?scht werden.
M?sste eigentlich alles funktionieren. -
F?r die meisten Funktionen gibts das PEAR-Paket PHP_Compat:
http://pear.php.net/package/PHP_Compat
Das hat auch eine fast hundertprozentig kompatible Variante von str_split() eingebaut.
Meine Variante ist schon etwas ?lter (und anscheinend umst?ndlicher als die von heavyraptor) -- funktioniert aber auch und ist so kompatibel, wie's nur geht zur Variante von PHP5 (Fehlermeldungen fehlen noch):
if( !function_exists('str_split') ) { // function str_split( $my_string = '', $split_length = 1 ) { if($split_length < 1) return(FALSE); if( $split_length >= strlen($my_string) ) return( array($my_string) ); $chars = array(); for($ctr=0; $ctr < strlen($my_string); $ctr = $ctr + $split_length) { $chars[] = substr($my_string, $ctr, $split_length); } return($chars); } // }
Um lediglich einen String in Teile von festgelegter L?nge zu zerlegen, gen?gt aber meistens eine Schleife mit substr().
http://de.php.net/manual/de/function.substr.php
Beitrag ge?ndert am 26.04.2006 01:04 von alopex -
Tut mir leid, aber warum macht ihr es euch eigentlich immer so umst?ndlich???
Mehr als die beiden Zeilen hier braucht man doch eigentlich gar nicht... >.<
$text = wordwrap ($string, $laenge, "\n",1);
$array = explode("\n", $text);
Oder habe ich irgend einen gravierenden Nachteil an meiner Variante ?bersehen (was sehr gut m?glich sein kann)? -
Ich hab ja geschrieben, dass meine Variante umst?ndlicher ist -- es aber auch einfacher geht. Deinen Post hatte ich da leider noch nicht gesehen, weil ich eine Weile gebraucht habe, um meinen Quellcode aus der entsprechenden Befehlsbibliothek rauszupulen und Lima-Code-Tag-tauglich zu machen ...
Das "umst?ndlich" bedeutet aber in meinem Fall, dass str_split() exakt so funktioniert wie die Funktion str_split() von PHP5. Wer das braucht, kann nur mit dieser umst?ndlichen Funktion arbeiten.
word_wrap() kann Probleme machen, wenn der zu zerteilende String selbst schon das Zeichen enth?lt, das du als Trenner benutzt (hier "\n"). Bei Strings mit mehreren Zeilen (zum Beispiel eine eingelesene Text-Datei) produziert das Unsinn. Das h?ngt vom Anwendungsfall ab, den schrotti12 im Auge hat. -
Also ich habe es eigentlich auch mit mehrzeiligen Texten probiert, da ich ja die selbe Bef?rchtung hatte und irgendwie hat es funktioniert. Zur Not macht man davor noch nl2br() und dann wieder zur?ck...naja gut wird auch problematisch werden und ist auch irgendwie umst?ndlicher...(verdammt^^)..
edit: naja ich ziehe alles zur?ck. Meine Funktion funktiniert zwar, aber man muss aufpassen, wo man sie einsetzt.^^
Beitrag ge?ndert am 26.04.2006 01:36 von i-spacke -
Hi,
ich hab in meiner Funktion noch die eine Fehlermeldung eingebaut (wenn $length < 1 ist), bringt zwar nicht viel, aber es ist besser, als wenn nur false zur?ckgeliefert wird.
Ich weiss nicht ob noch andere Fehlermeldungen eingebaut sind, ich denke jedoch nicht, dass es mehr gibt.
if (!function_exists("str_split")) { function str_split($str,$length = 1) { if ($length < 1) { trigger_error(__FUNCTION__ . "(): The length of each segment must be greater than zero.",E_USER_WARNING); return false; } $strlen = strlen($str); $ret = array(); for ($i = 0; $i < $strlen; $i += $length) { $ret[] = substr($str,$i,$length); } return $ret; } }
mfg,
hr -
@spacke
Wie gesagt, es h?ngt davon ab, was schrotti12 braucht. M?glicherweise reicht so eine einfache Variante auch -- sie w?rde auch schneller abgearbeitet werden.
@heavyraptor
Hi,
ich hab in meiner Funktion noch die eine Fehlermeldung eingebaut (wenn $length < 1 ist), bringt zwar nicht viel, aber es ist besser, als wenn nur false zur?ckgeliefert wird.
Das bringt nur dann was, wenn der Benutzer auch die Ausgabe von Fehlermeldungen aktiviert hat. Normalerweise sollte man die R?ckgabe von FALSE ja auch im Hauptprogramm abfangen -- diese PHP-Fehlermeldungen sind sehen so unprofessionell aus (meiner unbedeutenden Meinung nach) ...
Ich weiss nicht ob noch andere Fehlermeldungen eingebaut sind, ich denke jedoch nicht, dass es mehr gibt.
Deswegen hab ich die Meldungen auch weggelassen, weil ich zu faul war, die PHP5-Funktion mit s?mtlichen vorstellbaren falschen Parametern zu testen.
So wie es aussieht, gibts aber nur die eine Meldung.
Und so sieht str_split() in PHP_Compat aus:
if (!function_exists('str_split')) { function str_split($string, $split_length = 1) { if (!is_scalar($split_length)) { user_error('str_split() expects parameter 2 to be long, ' . gettype($split_length) . ' given', E_USER_WARNING); return false; } $split_length = (int) $split_length; if ($split_length < 1) { user_error('str_split() The length of each segment must be greater than zero', E_USER_WARNING); return false; } // Select split method if ($split_length < 65536) { // Faster, but only works for less than 2^16 preg_match_all('/.{1,' . $split_length . '}/s', $string, $matches); return $matches[0]; } else { // Required due to preg limitations $arr = array(); $idx = 0; $pos = 0; $len = strlen($string); while ($len > 0) { $blk = ($len < $split_length) ? $len : $split_length; $arr[$idx++] = substr($string, $pos, $blk); $pos += $blk; $len -= $blk; } return $arr; } } }
*nachtr?glich_einf?g*
Ich stelle gerade fest, dass der Autor dieser Funktion zu dem Schluss gekommen ist, dass preg_match_all() schneller ist als substr()! Das d?rfte alle meine bisherigen Vorurteile best?tigen , dass die PCRE-Funktionen wirklich schnell sind -- und nicht langsamer als die normalen String-Funktionen, wie manche gerne behaupten ... OmG! Ich hatte Recht! Ich bin ein Seher! Ich kan auf Wasser gehen! Kniehet vor mir im Dreck und streut euch Asche auf's Haupt!
//edit by system:
Dem Benutzer alopex wird hiermit das Leimschn?ffeln offiziell verboten ...
//edit by alopex
Verdammt, wo ist meine UHU-Tube!
Beitrag ge?ndert am 26.04.2006 02:12 von alopex -
Hi,
@alopex:
Warum sind die Funktionen von PHP Compact nicht identisch zu den funktionen in PHP 5?
Interessant, das mit den Regul?ren Ausdr?cken, ich denke jedoch auch, dass es auf den Regul?ren Ausdruck drauf an kommt.
Trotzdem kann eine string-Funktion nie so etwas wie ein Regularer Ausdruck.
Voll cool, ich benutz jetzt nur noch preg_match, preg_replace usw., lol ;)
mfg,
hr -
Sind sie nicht identisch? Zumindest sollte sich die Compat-Funktion genauso verhalten, wie die Funktion von PHP5.
Na gut, sie gibt eine falsche Fehler-Zeile an, weil sie user_error() zur Fehlerausgabe benutzt (ist das gleiche wie trigger_error() ), aber sonst m?sste sie sich gleich verhalten.
Was die PCRE-Funktionen betrifft, hier die ultimativ k?rzeste Version f?r schrotti12:
preg_match_all('/.{1,20}/s', $string, $segment);
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage