WinFuture-Forum.de: [php] String Nach Groesse Nicht Nach Laenge Kurzen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

[php] String Nach Groesse Nicht Nach Laenge Kurzen


#1 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 02. April 2005 - 01:31

Moin,

ich suche einen Weg, mit dem ich einen String zurechtschneiden kann. Normalerweise benutze ich dazu substr. Nur moechte ich nicht nach Laenge sondern nach Groesse schneiden. Ich moechte also beispielsweise alles von Byte 0 bis Byte 10 zurueckgeliefert haben. Das koennen unterscheidlich viele Zeichen sein. substr hilft hier also nicht.

Weiss da jemand einen Weg / Funktion?

Viele Gruesse,
PelzigesWaldtier
0

Anzeige



#2 Mitglied ist offline   normanbauer 

  • Gruppe: aktive Mitglieder
  • Beiträge: 139
  • Beigetreten: 09. Juni 05
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 10. Juni 2005 - 07:55

:allesgute:
Also ich hab mal gelernt, dass ein Zeichen mit einem Byte codiert wird?! Deswegen ist ja ein char=1Byte. Soweit ich weis, sogar systemunabhängig.
0

#3 Mitglied ist offline   Floele 

  • Gruppe: aktive Mitglieder
  • Beiträge: 919
  • Beigetreten: 22. Juni 04
  • Reputation: 0

geschrieben 10. Juni 2005 - 08:30

Bei UTF-8 zum Beispiel kann es aber auch anders sein.

Hier mal ein Code der auch im Handbuch steht, vielleicht hilft das (Edit: Das tut es glaube ich nicht, guck mal weiter unten).
<?php
// String intercept By Bleakwind At http://www.weaverdream.com
// utf-8:$byte=3 | gb2312:$byte=2 | big5:$byte=2
function bite_str($string, $start, $len, $byte=3)
{
   $str    = "";
   $count  = 0;
   $str_len = strlen($string);
   for ($i=0; $i<$str_len; $i++) {
       if (($count+1-$start)>$len) {
           $str  .= "...";
           break;
       } elseif ((ord(substr($string,$i,1)) <= 128) && ($count < $start)) {
           $count++;
       } elseif ((ord(substr($string,$i,1)) > 128) && ($count < $start)) {
           $count = $count+2;
           $i    = $i+$byte-1;
       } elseif ((ord(substr($string,$i,1)) <= 128) && ($count >= $start)) {
           $str  .= substr($string,$i,1);
           $count++;
       } elseif ((ord(substr($string,$i,1)) > 128) && ($count >= $start)) {
           $str  .= substr($string,$i,$byte);
           $count = $count+2;
           $i    = $i+$byte-1;
       }
   }
   return $str;
}

// Test
$str = "123456¶ז½ڱ23456ז·󴮱23456½؈¡º¯ʽ";
for($i=0;$i<30;$i++){
   echo "<br>".bite_str($str,$i,20);    
}
?>

Dieser Beitrag wurde von Floele bearbeitet: 10. Juni 2005 - 11:36

0

#4 Mitglied ist offline   normanbauer 

  • Gruppe: aktive Mitglieder
  • Beiträge: 139
  • Beigetreten: 09. Juni 05
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 10. Juni 2005 - 10:01

Zitat

// utf-8:$byte=3 | gb2312:$byte=2 | big5:$byte=2


Wie in dem Kommentar steht wird utf-8 mit 3byte kodiert. Ich bin von normalem ascii ausgegangen. >> http://www.miniuri.de/1d7922 punkt 5.5.6
Utf8 codiert ja ascii zeichen mit ascii zeichen. Normalerweise 2 oder 3 Byte. Aber wenn du weist welche Zeichencodierung verwendet wird, sind halt 2 oder 3 byte ein Zeichen.
0

#5 Mitglied ist offline   Floele 

  • Gruppe: aktive Mitglieder
  • Beiträge: 919
  • Beigetreten: 22. Juni 04
  • Reputation: 0

geschrieben 10. Juni 2005 - 10:26

Wenn das Waldtier von ASCII ausgegangen wäre, hätte er die Frage bestimmt nicht gestellt.
0

#6 Mitglied ist offline   normanbauer 

  • Gruppe: aktive Mitglieder
  • Beiträge: 139
  • Beigetreten: 09. Juni 05
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 10. Juni 2005 - 10:39

Wer weiß... :allesgute:
Im Grunde ist die Zeichenkodierung ja nur dafür relevant, um zu wissen, mit wievielen bytes ein Zeichenkodiert wird. Hier geht es ja nicht um den Inhalt sondern nur um die Länge. Wenn er weiß: 2bytes/Zeichen kann er mit substr ja auf 5 Zeichen kürzen, um auf 10 bytes zu kommen.
0

#7 Mitglied ist offline   Floele 

  • Gruppe: aktive Mitglieder
  • Beiträge: 919
  • Beigetreten: 22. Juni 04
  • Reputation: 0

geschrieben 10. Juni 2005 - 11:25

Hm, ich muss grade feststellen, dass die Funktion mit dem was du haben möchtest gar nichts zu tun hat. Probiere mal diese selbstgeschriebene Funktion (ich bin mir keinesfalls sicher, dass das was ich da gemacht habe so richtig ist, aber es hat jedenfalls in meinem Test funktioniert):

// als UTF-8 speichern, damit das Ü zwei Bytes bekommt.
$string = 'aÜbcde';

function sub_byte($string,$start = 0,$size = 0)
{
	$new_string = '';
	
	for($i = $start; $i < strlen($string);$i++)
	{
  $bytes = strlen(bin2hex($string{$i}))/2;
  
  if($size-$bytes >= 0)
  {
 	 $new_string .= $string{$i};
 	 $size -= $bytes;
  }
  else break;
	}
	return $new_string;
}

echo sub_byte($string,0,4); // gibt die ersten 3 Zeichen aus

Dieser Beitrag wurde von Floele bearbeitet: 10. Juni 2005 - 14:40

0

#8 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 10. Juni 2005 - 16:49

Zitat (Floele: 10.06.2005, 04:25)

Hm, ich muss grade feststellen, dass die Funktion mit dem was du haben möchtest gar nichts zu tun hat. Probiere mal diese selbstgeschriebene Funktion (ich bin mir keinesfalls sicher, dass das was ich da gemacht habe so richtig ist, aber es hat jedenfalls in meinem Test funktioniert)<{POST_SNAPBACK}>


Ja, so klappt es, Danke. Vielen Dank auch an alle anderen.

Gruesse,
Das Waldtier
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0