| 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! |
 |
|

10-06-2009, 14:29
|
|
Anbu
Registrierter Benutzer
|
|
Registriert seit: Dec 2006
Beiträge: 505
|
|
[PHP] Text teilen => Problem HTML Zeichen
Hi,
ich will einen Text teilen. An sich kein Problem, wären da nicht die HTML Zeichen.
Gibt es eine Funktion mit der ich herausfinden kann ob ich mich an Stelle X im String, in einem HTML Zeichen befinde, also z.B. $str[5] = "br />"
wenns keine gibt müsst ich mir eben ein array mit allen html zeichen erstellen und die Sache so abfragen.
Ich hoff da gibts ne elegantere Lösung.
__________________
Lurchi ! Lurchi ! Lurchi !
|

10-06-2009, 14:40
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.308
|
|
frage: was willst du mit den html-zeichen denn machen?
peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

10-06-2009, 15:05
|
|
Anbu
Registrierter Benutzer
|
|
Registriert seit: Dec 2006
Beiträge: 505
|
|
Mit den HTML Zeichen will ich direkt nichts machen. Ich will aber, dass sie richtig angezeigt werden und ich den Text nicht mitten in einem HTML Zeichen teile.
Zur Info: Der String kommt aus dem Tiny Editor
__________________
Lurchi ! Lurchi ! Lurchi !
|

10-06-2009, 15:08
|
|
MoRtAlAn
PHP Master
|
|
Registriert seit: Jan 2002
Ort: Mühlheim am Main
Beiträge: 5.934
|
|
Warum teilst du nicht anhand eines Leerzeichens welches sich an der entsprechenden Position oder in der Nähe befindet ?
Oder ist es ok, wenn du ein Wort einfach an irgendeiner Stelle trennst ?
|

10-06-2009, 15:10
|
|
Anbu
Registrierter Benutzer
|
|
Registriert seit: Dec 2006
Beiträge: 505
|
|
Das Problem ist dass ein Leerzeichen ja auch in einem HTML Zeichen vorkommen kann. z.B. <br />, in einem img tag, wo auch immer.
__________________
Lurchi ! Lurchi ! Lurchi !
|

10-06-2009, 16:54
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von Anbu
Gibt es eine Funktion mit der ich herausfinden kann ob ich mich an Stelle X im String, in einem HTML Zeichen befinde, also z.B. $str[5] = "br />"
|
Dazu wirst du schon sowas wie einen Parser brauchen.
Das kann im simpelsten Falle was selbstgeschriebenes sein, das einfach vom Beginn an < und > zählt und schaut, ob du dich an einer Position gerade "ausserhalb" befindest.
(Und mit sowas wie - also allgemein Entities bzw. anderen Sonderzeichen-Notationen - musst du natürlich auch noch aufpassen.)
"Fertig" kannst du das ganze auch bekommen - wenn du wohlgeformtes XHTML nutzt, dann kannst du das auch mit den DOM-Methoden von PHP parsen und dir daraus einen DOM-Baum erstellen lassen. Dessen Elemente kannst du dann durchlaufen, und schauen, bei welchen es sich um Textknoten handelt - und dann deine Zählung der Textlänge auf diese beschränken.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

10-06-2009, 16:59
|
|
Anbu
Registrierter Benutzer
|
|
Registriert seit: Dec 2006
Beiträge: 505
|
|
danke..
hmm werd wohl was selbst basteln müssen denn der Tiny gibt mir kein "wohlgeformtes XHTML" zurück
__________________
Lurchi ! Lurchi ! Lurchi !
|

10-06-2009, 18:43
|
unset
 Moderator
|
|
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.778
|
|
Die DOM Klassen von PHP (nicht die DOM-XML Klassen, die sind veraltet), kommen auch ganz gut mit kaputten XHTML/HTML klar –*man muss nur damit rechnen, dass sie versuchen zu reparieren und damit evtl. was kaputt machen.
Wenn ich das nicht falsch in Erinnerung habe, gibt TinyEdit aber durchaus valides HTML aus … ?!
|

10-06-2009, 19:46
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Warum willst du den Text teilen bzw. was hast du mit den einzelnen Teilen vor?
Wenn du das Markup gar nicht mehr brauchst, mach vorher einfach ein strip_tags(). Solltest du das Markup noch brauchen, musst du beim Teilen mehr beachten als nur außerhalb eines HTML-Tags zu sein. Du brauchst dann einen Parser, der die gesamte Verschachtelung für dich "aufsammelt", damit du sie beim Teilen nicht zerstörst.
Ein Beispiel: <div><h1>Titel</h1><p>Text Text</p><p>Text Text</p></div>
Egal wo du das teilst, du machst dabei immer das DIV kaputt. Willst du den Text zweispaltig darstellen oder auf mehrere Seiten verteilen (Paging), musst du das Markup nach der Teilung "reparieren".
Falsch:
<div><h1>Titel</h1><p>Text Text</p>
<p>Text Text</p></div>
Richtig:
<div><h1>Titel</h1><p>Text Text</p></div>
<div><p>Text Text</p></div>
Dabei tritt noch ein kleines, aber unlösbares Problem auf: Du musst alle Paramater übernehmen, um die CSS-Formatierung zu erhalten. Wenn nun das DIV eine ID hat, hast du diese ID anschließend zweimal im Dokument und das ist kein valides HTML mehr (in den meisten Browsern funktionierts aber dennoch).
|

10-06-2009, 23:31
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von Anbu
Hi,
ich will einen Text teilen. An sich kein Problem, wären da nicht die HTML Zeichen.
Gibt es eine Funktion mit der ich herausfinden kann ob ich mich an Stelle X im String, in einem HTML Zeichen befinde, also z.B. $str[5] = "br />"
|
PHP-Code:
preg_match('/\G[^<>]+(?=<[^>]+>)/', $html_src, $matches, FALSE, $offset);
Der RegEx "versagt" an zwei Stellen: Am Anfang und am Ende der Datei. Da du aber sicher nicht vor und nach dem html-Element teilen willst, sollte das kein Problem darstellen.
Ach, und natürlich ist <[^>]+> stark vereinfacht. Falls du kaputtes HTML damit prüfen willst, muss der Teil umfangreicher gemacht werden.
Zitat:
Zitat von onemorenerd
Warum willst du den Text teilen bzw. was hast du mit den einzelnen Teilen vor? ...
|
Möglicherweise will er nur einen Zeilenumbruch einfügen?
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
Geändert von fireweasel (10-06-2009 um 23:40 Uhr)
|

11-06-2009, 10:51
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Zitat:
Zitat von fireweasel
Möglicherweise will er nur einen Zeilenumbruch einfügen?
|
Ein DIV drumherum mit entsprechend CSS reicht nicht?
|

11-06-2009, 12:58
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von onemorenerd
Ein DIV drumherum mit entsprechend CSS reicht nicht?
|
Zum Darstellen im Browser sicher -- aber es gibt Leute, die möchten Quelltexte gerne formatieren. Damit's schöner aussieht, oder was-weiß-ich-auch-immer ... ;-)
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
|

12-06-2009, 12:05
|
|
Anbu
Registrierter Benutzer
|
|
Registriert seit: Dec 2006
Beiträge: 505
|
|
Also was ich vor hab:
Einen Text aus einem Tiny auf mehrere Divs(keine feste höhe) verteilen.
hmm ich werds mal mit den RegExpr probieren.
Mit meiner Funktion schaff ichs den Text 2 mal zu teilen. Das dritte mal geht er bis ans ende des textes.
PHP-Code:
function spilt_text($txt,$i) {
$plain_text = strip_tags($txt);
$lenghth = strlen($plain_text);
$part = floor($lenghth/$i);
for($z=1;$z<=$i;$z++)
{
$part = ($part * $z)+1;
while($plain_text[$part] == " " && $part < $lenghth)
{
$part++;
}
$word = trim(substr($plain_text,strrpos(substr($plain_text,0,$plain_text[$part]-1),' '),$plain_text[$part]));
$pos[] = stripos(substr($txt,$part), $word) + strlen(substr($txt,0,$part));
}
return $pos;
}
 an alle
__________________
Lurchi ! Lurchi ! Lurchi !
|

12-06-2009, 12:21
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von Anbu
Also was ich vor hab:
Einen Text aus einem Tiny auf mehrere Divs(keine feste höhe) verteilen.
|
Welche Probleme du damit zu erwarten hast, wenn du das zu primitv angehst, hat onemorenerd ja schon dargelegt.
Zitat:
|
hmm ich werds mal mit den RegExpr probieren.
|
Halte ich dafür für vollkommen ungeeignet.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

12-06-2009, 17:41
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Zitat:
Zitat von Anbu
Also was ich vor hab:
Einen Text aus einem Tiny auf mehrere Divs(keine feste höhe) verteilen.
|
Dachte ich mir schon. Das teilen von HTML begegnet mir eigentlich immer nur aus zwei Gründen: Spaltendarstellung wie bei dir oder bei der Erzeugung von Anrisstexten. Letzteres ist einen Tick einfacher zu lösen, weil man am Ende nur alle Tags wieder schließen muss. Du musst diese Tags in der nächsten Spalte aber auch wieder aufmachen. Das ist deswegen schwieriger, weil du die Parameter der Tags mitschleppen musst (zumindest Id und Class fürs CSS).
Falls die Spalten bei der Anzeige ungefähr gleich lang werden sollen, dann verlege dich lieber gleich auf eine clientseitige Lösung mit Javascript.
|
|
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
|