Seite 1 von 2

htmlentities oder htmlspecialchars

Verfasst: 13.01.2005, 01:27
von Pretender
Moin Moin an alle PHP Experten! :wink:

ich habe da mal ein kleineres problem.
Ich habe ein UTF8 XML Seite die ich mit folgenden Script auslese:

[php]
<?php
$rdffile = "Hier steht die XML URL";
$content = implode ("", file ($rdffile));
preg_match_all("|<product(.*)>(.*)</product>|Uism",$content, $items, PREG_PATTERN_ORDER);
for ($i=0;$i<count($items[0]);$i++)
{ preg_match_all(
"|<name>(.*)</name>(.*)<description>(.*)</description>(.*)<imageUrl>(.*)</imageUrl>(.*)<productUrl>(.*)</productUrl>(.*)<price>(.*)</price>(.*)<currency>(.*)</currency>|Uism",$items[0][$i], $regs, PREG_PATTERN_ORDER);
echo
"<img src='".$regs[5][0]."'>
".$regs[1][0]."
".$regs[3][0]."<br>
Preis: ".$regs[9][0]."
".$regs[11][0]."
<br>
<a href='".$regs[7][0]."' target='_blank'>Klicken Sie hier für alle Details</a><br><br><br><br><br><br><br>\n"; }
?>
[/php]

auf meiner Seit werden nun die Sonderzeichen nicht umgewandelt und ich bekomme folgenden Text angezeigt:

<!--Textanfang-->
Intel&reg; Pentium&reg; D Prozessor 710 (1.40 GHz, 2 MB Cache, 400 MHz FSB)+15.0 XGAMicrosoft&reg; Windows&reg; XP Home
<!--Textende-->

Mit wurde gesagt das ich es mit htmlspecialchars oder htmlentities versuchen soll.
Da ich nun allerdings nicht so ganz fit bin in PHP...
Wie müsste das obige Script aussehen um die UTF8 Seite in 8859-1 (nehme ich an) gewandelt zu werden?

Vielen Dank an alle!

Verfasst:
von

Verfasst: 13.01.2005, 09:41
von MikeD
Sieht so aus als ob deine '&' als & auftauchen - also anstatt &reg; kommt &reg raus.

Versuch mal :

Code: Alles auswählen

$content = preg_replace&#40;'/&#&#40;x&#91;a-f0-9&#93;+|&#91;0-9&#93;+&#41;;/i', '&#$1;', $content&#41;;
hinter der dritten zeile: nicht getestet.

Verfasst: 13.01.2005, 12:04
von Pretender
Moin Moin,
Ich habe der 3. Zeile Deinen Codeschnipsel angehängt.

Code: Alles auswählen

$content = implode &#40;"", file &#40;$rdffile&#41;&#41;;$content = preg_replace&#40;'/&#&#40;x&#91;a-f0-9&#93;+|&#91;0-9&#93;+&#41;;/i', '&#$1;', $content&#41;;
funktioniert leider nicht. Die Darstellung von & ® und anderen Sonderzeichen wird immernoch falsch wiedergegeben. :cry:

mfg
Pretender

Verfasst:
von
SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Verfasst: 13.01.2005, 22:55
von MikeD
probiers mal damit:

Code: Alles auswählen

$content = ereg_replace&#40;'&', '&', $content&#41;;
hatte den regulären Ausdruck des anderen code nicht überprüft - so früh morgens fast unmöglich ;) - war den ganzen tag unterwegs - deshalb die späte antwort.

Verfasst: 14.01.2005, 00:25
von Pretender
moin moin,

schau dir den code mal an:

Code: Alles auswählen

<?php 
$rdffile = "hier steht die url der xml seite"; 
$content = implode &#40;"", file &#40;$rdffile&#41;&#41;;
$content = ereg_replace&#40;'&', '&', $content&#41;;
preg_match_all&#40;"|<product>&#40;.*&#41;</product>|Uism",$content, $items, PREG_PATTERN_ORDER&#41;; 
for &#40;$i=0;$i<count&#40;$items&#91;1&#93;&#41;;$i++&#41; 
&#123; preg_match_all&#40; 
"|<name>&#40;.*&#41;</name>&#40;.*&#41;<description>&#40;.*&#41;</description>&#40;.*&#41;<imageUrl>&#40;.*&#41;</imageUrl>&#40;.*&#41;<productUrl>&#40;.*&#41;</productUrl>&#40;.*&#41;<price>&#40;.*&#41;</price>&#40;.*&#41;<currency>&#40;.*&#41;</currency>|Uism",$items&#91;1&#93;&#91;$i&#93;, $regs, PREG_PATTERN_ORDER&#41;; 
$regs&#91;3&#93;&#91;0&#93; = str_replace &#40;"&","&",$regs&#91;3&#93;&#91;0&#93;&#41;; 
$regs&#91;11&#93;&#91;0&#93; = str_replace &#40;"&","&",$regs&#91;11&#93;&#91;0&#93;&#41;; 
$regs&#91;3&#93;&#91;0&#93; = str_replace &#40;"reg;","®",$regs&#91;3&#93;&#91;0&#93;&#41;; 
$regs&#91;11&#93;&#91;0&#93; = str_replace &#40;"reg;","®",$regs&#91;11&#93;&#91;0&#93;&#41;; 
echo 
"<img align=left width=110 height=110 src='".$regs&#91;5&#93;&#91;0&#93;."'> 
".utf8_decode&#40;$regs&#91;1&#93;&#91;0&#93;&#41;."
".utf8_decode&#40;$regs&#91;3&#93;&#91;0&#93;&#41;."<br> 
Preis&#58; ".utf8_decode&#40;$regs&#91;9&#93;&#91;0&#93;&#41;." 
".utf8_decode&#40;$regs&#91;11&#93;&#91;0&#93;&#41;." 
<br> 
<a href='".utf8_decode&#40;$regs&#91;7&#93;&#91;0&#93;&#41;."' target='_blank'>Klicken Sie hier für alle Details</a><br><br><br><br><br><br><br>\n"; &#125; 
?>
ich hatte schon einge zeit damit rumzuspielen. wenn ich deine zeile mit einfügt passiert im grunde garnichts. die ausgabe bleibt die selbe!
"&®" ist nun das was ausgegebn wird.

das problem scheint, das dass sonderzeichen "®" aus zwei zeichen zusammengesetzt werden muss. aus dem "&" und aus dem "reg;"

aus dem "&" wird dann ein "&" und ein "reg;" was zusammen "&reg;" wäre und im grunde eine "®" ergeben sollte.

das interessante ist, wenn ich NUR das "reg;" hätte, dann gäbe es keine probleme. allerdnings sind da noch andere zeichen. im grunde liegt es wohl an den charset utf-8 was umgewandelt werden muss. ä, ü , ö werden auch falsch dargestellt.

hier kannst du dir das ergbebnis mal genau anschauen.

https://www.laptop-laptop.de/test.php <--- testseite!
auf der rechten seite der testseite, steht die ausgabe mit den script von hier.

ich hoffe du hast verstanden was ich meine :oops:

bis denne

Verfasst: 14.01.2005, 01:21
von MikeD

Code: Alles auswählen

$regs&#91;3&#93;&#91;0&#93; = str_replace &#40;"&","&",$regs&#91;3&#93;&#91;0&#93;&#41;;
$regs&#91;11&#93;&#91;0&#93; = str_replace &#40;"&","&",$regs&#91;11&#93;&#91;0&#93;&#41;;
$regs&#91;3&#93;&#91;0&#93; = str_replace &#40;"reg;","®",$regs&#91;3&#93;&#91;0&#93;&#41;;
$regs&#91;11&#93;&#91;0&#93; = str_replace &#40;"reg;","®",$regs&#91;11&#93;&#91;0&#93;&#41;; 
mach mal ne kopie von der php und nimm die zeilen raus - damit machst du das replace ja doppelt gemoppelt ;)

um den utf-8 generell zu wandeln kenn ich leider keine Lösung - evtl. weiß da jemand etwas oder hat die fertigen strings parat, aber wenn du selbst hand anlegen willst, bis du alle hast:

Code: Alles auswählen

$search = array&#40;'zuersetzen1', 'zuersetzen2'&#41;; 
$replace = array&#40;'ersetzenmit1', 'ersetzenmit2'&#41;;  
$content = str_replace&#40;$search, $replace, $content&#41;; 
reihenfolge beachten und jeweils mit ,'etwas' erweitern - die drei zeilen dann anstatt der einen einsetzen.

Verfasst: 15.01.2005, 13:13
von Pretender
Moin Moin,

Code: Alles auswählen

<?php 
$rdffile = "hier steht die URL der XML Seite"; 
$content = implode &#40;"", file &#40;$rdffile&#41;&#41;; 
preg_match_all&#40;"|<product>&#40;.*&#41;</product>|Uism",$content, $items, PREG_PATTERN_ORDER&#41;; 
for &#40;$i=0;$i<count&#40;$items&#91;1&#93;&#41;;$i++&#41; 
&#123; preg_match_all&#40; 
"|<name>&#40;.*&#41;</name>&#40;.*&#41;<description>&#40;.*&#41;</description>&#40;.*&#41;<imageUrl>&#40;.*&#41;</imageUrl>&#40;.*&#41;<productUrl>&#40;.*&#41;</productUrl>&#40;.*&#41;<price>&#40;.*&#41;</price>&#40;.*&#41;<currency>&#40;.*&#41;</currency>|Uism",$items&#91;1&#93;&#91;$i&#93;, $regs, PREG_PATTERN_ORDER&#41;; 
$search = array&#40;'&', 'reg;'&#41;; 
$replace = array&#40;'&', 'reg;'&#41;;  
$content = str_replace&#40;$search, $replace, $content&#41;;                  echo 
"<img align=left width=110 height=110 alt=Laptop&nbsp;von&nbsp;Fujitsu&nbsp;Siemens&nbsp;im&nbsp;Laptop&nbsp;Shop src='".$regs&#91;5&#93;&#91;0&#93;."'> 
<h1>".utf8_decode&#40;$regs&#91;1&#93;&#91;0&#93;&#41;."</h1> 
".utf8_decode&#40;$regs&#91;3&#93;&#91;0&#93;&#41;."<br> 
Preis&#58; ".utf8_decode&#40;$regs&#91;9&#93;&#91;0&#93;&#41;." 
".utf8_decode&#40;$regs&#91;11&#93;&#91;0&#93;&#41;." 
<br> 
<a href='".utf8_decode&#40;$regs&#91;7&#93;&#91;0&#93;&#41;."' target='_blank'>Klicken Sie hier für alle Details</a><br><br><br><br><br><br><br>\n"; &#125; 
?>
Also mit diesem Script, funktioniert es leider auch nicht.
wäre das jetzt der richtige script? ich habe so viele verschiedene Möglichkeiten versucht, ich weiss nicht mehr was richtig oder falsch war.

hilf mir bitte nochmal :roll:

vielen Dank

Verfasst: 15.01.2005, 13:45
von MikeD

Code: Alles auswählen

<?php
$rdffile = "Hier steht die XML URL";
$content = implode &#40;"", file &#40;$rdffile&#41;&#41;;
$search = array&#40;'&'&#41;;
$replace = array&#40;'&'&#41;; 
$content = str_replace&#40;$search, $replace, $content&#41;;
preg_match_all&#40;"|<product&#40;.*&#41;>&#40;.*&#41;</product>|Uism",$content, $items, PREG_PATTERN_ORDER&#41;;
for &#40;$i=0;$i<count&#40;$items&#91;0&#93;&#41;;$i++&#41;
&#123; preg_match_all&#40;
"|<name>&#40;.*&#41;</name>&#40;.*&#41;<description>&#40;.*&#41;</description>&#40;.*&#41;<imageUrl>&#40;.*&#41;</imageUrl>&#40;.*&#41;<productUrl>&#40;.*&#41;</productUrl>&#40;.*&#41;<price>&#40;.*&#41;</price>&#40;.*&#41;<currency>&#40;.*&#41;</currency>|Uism",$items&#91;0&#93;&#91;$i&#93;, $regs, PREG_PATTERN_ORDER&#41;;
echo
"<img src='".$regs&#91;5&#93;&#91;0&#93;."'>
".$regs&#91;1&#93;&#91;0&#93;."
".$regs&#91;3&#93;&#91;0&#93;."<br>
Preis&#58; ".$regs&#91;9&#93;&#91;0&#93;."
".$regs&#91;11&#93;&#91;0&#93;."
<br>
<a href='".$regs&#91;7&#93;&#91;0&#93;."' target='_blank'>Klicken Sie hier für alle Details</a><br><br><br><br><br><br><br>\n"; &#125;
?> 
jou - du hattest noch das utf8_decode eingebaut - das ersetzen an der falschen stelle usw.
Probier mal den code ersatzweise aus - hab dein erstes posting genommen und es eingebaut (btw. 'reg;' mit 'reg;' zu ersetzen ist wie ein ei wegnehmen und wieder hinlegen - zwei unnötige Arbeitsschrittte ;) )

wenn du nach dem einbau noch irgendwas siehst, was nicht korrekt ist, dann die regeln erweitern um die entsprechenden Zeichen und deren Ersatz.

Verfasst: 15.01.2005, 15:56
von Pretender
Hallo Mike,

Vielen Dank erst einmal für Deine Mühe!

soweit macht das Script schon fast was es machen soll.

Ich habe es erweitert und zwa mit:

Code: Alles auswählen

                   $search = array&#40;'&' , 'reg;'&#41;;
                   $replace = array&#40;'&' , '®'&#41;;
die Ausgabe ist nun:

[Text]

[/Text]

Normal sollte aber aus "&reg;" das genannte sonderzeichen werden.


Daher habe ich folgendes versucht!

Code: Alles auswählen

                   $search = array&#40;'&reg;'&#41;;
                   $replace = array&#40;'®'&#41;;

Aber ohne Erfolg. Es muss irgendwie aus den 2 zeichen, eins gemacht werden dann kann man das sicher auch auf umlaute anwenden.

haste du vieleicht noch eine andere Idee?

Verfasst: 15.01.2005, 19:28
von Jörg
Die Codierung:

Code: Alles auswählen

&reg;
entsteht, wenn man zweimal hintereinander htmlentities() auf ® anwendet

rückgängig macht man das, wenn man zweimal hintereinander die Umkehrfunktion html_entity_decode() anwendet

danach kann man ® und andere Zeichen mit einer Funktion wie dieser in UTF8 codieren (dort fehlt allerdings noch das ®)


Edit:

ich habe es glaub ich zuerst missverstanden, dir geht es um eine Ausgabe in HTML?

dann reicht einmal die Funktion html_entity_decode(), um aus einem &reg; ein &reg; zu machen

Verfasst: 15.01.2005, 20:29
von Pretender
moin,

um es als html ausgabe ins "&reg;" zu machen, ist nicht so das problem, das problem ist, dass es nicht im quellcode als "&reg;" steht sondern als "&reg;"

der Browser wandelt es dann in erst in ein "&reg;"

tjo... kein ahnung wie ichs machen soll.

Verfasst: 15.01.2005, 20:40
von Jörg
Mit HTML Ausgabe meinte ich ja den HTML-Quellcode (im Gegensatz zur XML-Ausgabe)

html_entity_decode() macht aus "&reg;" "&reg;"
und der Browser macht aus "&reg;" "®"

Verfasst: 15.01.2005, 21:09
von Pretender
ok, kannst du mir eventuell das html_entity_decode in den obigen script einfügen? ich bin nicht so der php experte.

wäre scht supi fein :roll:

Verfasst: 15.01.2005, 21:30
von Jörg
Probier es mal so:

<?php
$rdffile = "Hier steht die XML URL";
$content = implode ("", file ($rdffile));
$content = html_entity_decode($content);
preg_match_all("|<product(.*)>(.*)</product>|Uism",$content, $items, PREG_PATTERN_ORDER);

/* ... weiter im Code... */

?>

Verfasst: 15.01.2005, 22:27
von Pretender
Moin Jörg!

deine idee war richtig, ich habe den code noch etwas ausgebessert, schau mal hier:

Code: Alles auswählen

<?php 
$rdffile = "http&#58;//pf.tradedoubler.com/pf/pf?a=1021138&description=GB&categoryId=19&programs=705&maxResults=11&lastResult=0"; 
$content = implode &#40;"", file &#40;$rdffile&#41;&#41;;
&#91;b&#93;$content = html_entity_decode&#40;$content&#41;;&#91;/b&#93; 
preg_match_all&#40;"|<product&#40;.*&#41;>&#40;.*&#41;</product>|Uism",$content, $items, PREG_PATTERN_ORDER&#41;;  
for &#40;$i=0;$i<count&#40;$items&#91;0&#93;&#41;;$i++&#41; 
&#123; preg_match_all&#40; 
"|<name>&#40;.*&#41;</name>&#40;.*&#41;<description>&#40;.*&#41;</description>&#40;.*&#41;<imageUrl>&#40;.*&#41;</imageUrl>&#40;.*&#41;<productUrl>&#40;.*&#41;</productUrl>&#40;.*&#41;<price>&#40;.*&#41;</price>&#40;.*&#41;<currency>&#40;.*&#41;</currency>|Uism",$items&#91;0&#93;&#91;$i&#93;, $regs, PREG_PATTERN_ORDER&#41;; 
echo 
"<img src='".$regs&#91;5&#93;&#91;0&#93;."'> 
".$regs&#91;1&#93;&#91;0&#93;." 
&#91;b&#93;".html_entity_decode&#40;utf8_decode&#40;$regs&#91;3&#93;&#91;0&#93;&#41;&#41;."&#91;/b&#93;<br> 
Preis&#58; ".$regs&#91;9&#93;&#91;0&#93;." 
".$regs&#91;11&#93;&#91;0&#93;." 
<br> 
<a href='".$regs&#91;7&#93;&#91;0&#93;."' target='_blank'>Klicken Sie hier für alle Details</a><br><br><br><br><br><br><br>\n"; &#125; 
?>
und jetzt klappt es super fein! ich danke dir echt herzlich dafür!!!

vielen dank
bye