Anführungszeichen aus img alt entfernen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
alt tag
alt text
array
attribut
ausdruck
auslese
code
dank
ecke
funktionieren
http
hut
problem
tag
tagesschau
teilen
text
treffer
url
zeichen
-
Hallo
.... ich will den tag/alt text">alt Text aus den IMG Tags der Tagesschau RSS auslesen
.
dabei habe img TAGs mit falschem alt Attributen (in content:encoded)
innerhalb des alt="...." Attributes steht Text mit weitern Anführungszeichen.
BSP:$html = '<img src="xyz" alt="Mein "Hut" der hat drei Ecken" />';
BSP:
// -------------------------------------------------------------------- $html = '<img src="xyz" alt="Mein "Hut" der hat drei Ecken" />'; preg_match_all('/(src|alt)=["\'](.*?)["\']/uis', $html, $result, PREG_SET_ORDER); // -------------------------------------------------------------------- print '<pre style="margin:16px 4px; padding:4px; text-align:left; background:#DEDEDE;">'."\n"; print_r($result); print '</pre>'."\n"; print '<br />'."\n"; print '<br />'."\n"; // --------------------------------------------------------------------
dadurch kommt beim Auslesen der Attribute ein "falsches" $result Ergebnis:
Array ( [0] => Array ( [0] => src="xyz" [1] => src [2] => xyz ) [1] => Array ( [0] => alt="Mein " [1] => alt [2] => Mein ) )
ich muss also die Anführungszeichen innnerhalb des alt-Text weg-bekommen / entfenen.
Idee:dazu .... mit einem preg_replace()
.... alle " aus dem Text zwischen
undalt="
entfernen." />
FRAGE: ..... Wie muss der Pattern für das preg_replace aussehen?
... oder andere Lösungs-Ideen ????
Danke.
... und nein, ... ich kann den Code nicht schon bei Erstellung verändern
ich bekomme solche "faschen" alt Werte duch Auslesen einer XML / RSS
die Quelle des Fehlers ist die Tagesschau RSS:http://www.tagesschau.de/xml/rss2
dort sind solche übelst falschen alt Attribute in den img TAGs von content:encoded
hier ein Beispiel, was die Tagesschau RSS iefert ...
... beachte den <img> TAG in content:encoded
<item> <title>"Pegida - in Teilen offen rechtsradikal"</title> <link>http://www.tagesschau.de/inland/pegida-dresden-127.html</link> <pubDate>Tue, 20 Oct 2015 12:34:19 +0200</pubDate> <content:encoded><![CDATA[ <p> <a href="http://www.tagesschau.de/inland/pegida-dresden-127.html"><img src="http://www.tagesschau.de/multimedia/bilder/pegida-363~_v-mittel16x9.jpg" alt=""Pegida"-Aufmarsch in Dresden | Bildquelle: REUTERS"/></a> <br/><br/> Die Zeit der Gespräche mit "besorgten Bürgern" ist vorbei: Inzwischen stuft die Bundesregierung die "Pegida"-Bewegung als "in Teilen offen rechtsradikal" ein. Politiker aller Parteien warnen vor weiterer Hetze, ein "Pegida"-Redner wurde zudem angezeigt. Die Staatsanwaltschaft ermittelt. [<a href="http://www.tagesschau.de/inland/pegida-dresden-127.html">mehr</a>] </p> <p> <ul> <li> <a href="http://www.tagesschau.de/inland/pegida-dresden-119.html">Dresden zwischen Herz und "Pegida", 19.10.2015</a> </li> <li> <a href="http://www.tagesschau.de/inland/pegida-verfassungsschutz-101.html">Innenministerium hält ''Pegida''-Verbot für unmöglich, 19.10.2015</a> </li> <li> <a href="http://www.tagesschau.de/multimedia/video/video-125747.html">Video: Reaktionen auf "Pegida"-Aufmarsch</a> </li> </ul> </p> <p><a href="http://www.tagesschau.de/inland/pegida-dresden-127.html">Meldung bei www.tagesschau.de lesen</a></p> ]]></content:encoded> <description>Die Zeit der Gespräche mit "besorgten Bürgern" ist vorbei: Inzwischen stuft die Bundesregierung die "Pegida"-Bewegung als "in Teilen offen rechtsradikal" ein. Politiker aller Parteien warnen vor weiterer Hetze, ein "Pegida"-Redner wurde zudem angezeigt. Die Staatsanwaltschaft ermittelt.</description> <guid>http://www.tagesschau.de/inland/pegida-dresden-127.html</guid> </item>
also muss ich den Quellcode vor der weiter-Verarbeitung zerst "reparieren"
dazu suche ich jetzt einen RegEx Pattern der das kann (siehe oben) ... oder andere Lösung
Beitrag zuletzt geändert: 20.10.2015 15:15:17 von opsuche -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Im Wesentlichen lässt sich das ganz gut mit regulären Ausdrücken verwirklichen. Was du suchst ist ja quasi ein Text, vor dem sich alt=" befindet und der durch " wieder abgeschlossen wird. Das funktioniert mit sogenannten Lockaheads bzw. Lockbehinds:
Link
Den regulären Ausdruck aufzustellen solltest du dann selbst schaffen... .
mfg
Jonas -
Danke,
... erstmal brauche ich ja den alt-String inklusive der Anführungszeichen
habs jetzt mal so, aber damit bekomme ich "nur" den alt Wert (ohne src)
$html = 'Bla bla <img src="xyz" alt="Mein "Hut" der hat "drei" Ecken" /> blabla'; $alt_pattern = '/alt="(.*?)"+?\s?\/>/uis'; preg_match($alt_pattern, $html, $result2); $alt_value1 = $result2[1]; $alt_value2 = str_replace('"','',$alt_value1); print '</p>'.$alt_value1.'</p>'."\n"; // Mein "Hut" der hat "drei" Ecken print '</p>'.$alt_value2.'</p>'."\n"; // Mein Hut der hat drei Ecken
... das könnte so für meine Zwecke funktionieren .. oO
aber ... Problem noch, wenn img TAG hinten mehr enthält wie z.B.:
.... hat "drei" Ecken" border="0" />
dann ist auch
mit im Trefferborder="0"
das mit Lockaheads verstehe ich noch nicht ganz
ich kann zwar damit in dem alt-text den "Text" in Anführungszeichen finden
aber wie bekomme ich damit die überflüssigen Anführungszeichen los ?!
... BSP (mein Versuch)
$lookahead = '"(?<=")(.*?)(?=")"'; preg_match_all('/'.$lookahead.'/uis', $alt_value, $result3);
$result3 Ergebnis:
Array ( [0] => Array ( [0] => "Hut" [1] => "drei" ) [1] => Array ( [0] => Hut [1] => drei ) )
bekomme damit zwar die Treffer für die Worte in Anführungszeichen im alt-Text
aber dann ... bzw. was bringt mir das ?
-
opsuche schrieb:
... das könnte so für meine Zwecke funktionieren .. oO
Das ist ja schon einmal gut ;)
opsuche schrieb:
aber ... Problem noch, wenn img TAG hinten mehr enthält wie z.B.:
.... hat "drei" Ecken" border="0" />
dann ist auch
mit im Trefferborder="0"
Das macht es etwas kniffliger. Schließlich musst du herausfinden, welches Anführungszeichen den Alt-Tag beendet, wenn jedoch Anführungszeichen davor und danach kommen muss dein Skript zusätzlich noch wissen, welche zwei Anführungszeichen "zusammengehören". Dabei müsste es die anderen Tags zuerst abarbeiten um herauszufinden, welcher Teil den jetzt genau zum Alt-Tag gehört... Ich glaube nicht, dass so etwas mit regulären Ausrücken möglich bzw. effizient ist, also wirst du wohl mit PHP ein bisschen spielen müssen.
Vielleicht kannst du es aber einfach auch mit folgendem Trick versuchen: Nach dem Anführzungszeichen, das den Alt-Tag beendet sollte in der Regel ein Leerzeichen stehen. Dieses Leerzeichen findet sich aber nicht bei bspw. border="0". Wenn du im regulären Ausdruck also nach (" ) [Anführungszeichen + Whitespace] suchst, sollten andere Attribute nicht mit reinrutschen.
opsuche schrieb:
das mit Lockaheads verstehe ich noch nicht ganz
ich kann zwar damit in dem alt-text den "Text" in Anführungszeichen finden
aber wie bekomme ich damit die überflüssigen Anführungszeichen los ?!
Ich würde sagen, du machst es einfach so, wie es schon klappt. Wie das mit regulären Ausdrücken funktioniert wüsste ich nicht...
mfg
Jonas -
Was du noch tun könntest: dein Attribut sieht ja ca so aus:
Jetzt könntest du auf alles, was nicht mitalt="ein "Attribut" mit ALT-Text"
anfängt, aber als nächstes ein=
hat, bis zum nächsten"
matchen. Das würde in diesem Fall nur noch"
ergeben. Da ersetzt du die"Attribut"
durch"
und schon sollte es funktionieren."
Die Stellen an denen du das überhaupt ersetzen musst kannst du ja finden, indem du alle Tags (also von
bis<
) nimmst.>
Eine alternative Lösung wäre: Du suchst nach
gefolgt von einem Zeichen (nicht Whitespace!), dann beliebig viele Zeichen (aber nicht greedy), dann ein Whitespace und anschließend wieder ein"
gefolgt von einem Zeichen (nicht Whitespace). Das würde also z.B. bei"
den Teilein "text mit "Anführungszeichen" usw"
liefern. Da ersetzt du das 2."text mit "A
durch ein"
. Das gleiche machst du jetzt noch für die umgekehrte Richtung, und du erhälst aus"
das:ein "text mit "Anführungszeichen" usw"
Das wäre eigentlich genau das was du willst, und das funktioniert sogar ganz ohne Kenntnis der Tag-Struktur, Attribut-Tags o.ä.ein "text mit "anführungszeichen" usw"
-
Hallo
habe jetzt eine Funktion zum reparieren der Alt-Werte im IMG Tag gebaut:
... auch für den Fall, das hinten noch border="0" mit im IMG Tag steht.
BSP:
<?php // -------------------------------------------------------------------- header("Content-Type: text/html; charset=utf-8"); mb_internal_encoding("UTF-8"); // -------------------------------------------------------- function repair_alt_value($htmlstring) { $alt_pattern = '/alt="(.*?)"+?\s?\/?>/uis'; preg_match($alt_pattern, $htmlstring, $result); $alt_value1 = $alt_value2 = $result[1]; $px = mb_strpos($alt_value1, 'border='); if (FALSE !== $px) { $alt_value2 = trim(mb_substr($alt_value1, 0, $px)); } $alt_value2 = str_replace('"','',$alt_value2); return array($alt_value1,$alt_value2); } // -------------------------------------------------------- ###### test 1 ###### $html_org = 'Bla bla <img src="xyz" alt="Mein "Hut" der hätte "fünf" Ecken" border="0" /> blabla'; $html_org = utf8_encode($html_org); $altstrdx = repair_alt_value($html_org); $html_new = str_replace( $altstrdx[0], $altstrdx[1], $html_org ); $alt_value = $altstrdx[1]; print '<br /> OLD: <em>'. htmlentities($html_org) .'</em>'."\n"; print '<br /> NEW: <em>'. htmlentities($html_new) .'</em>'."\n"; print '<br /> ALT: <u>'. $alt_value .'</u>'."\n"; print '<br /> '."\n"; // -------------------------------------------------------- ###### test 2 ###### $html_org2 = 'Bla bla <img src="abc" alt="Meine "Nase" die hätte "zwölf" Ecken"> blabla'; $html_org2 = utf8_encode($html_org2); $altstrdx2 = repair_alt_value($html_org2); $html_new2 = str_replace( $altstrdx2[0], $altstrdx2[1], $html_org2 ); $alt_value2 = $altstrdx2[1]; print '<br /> OLD: <em>'. htmlentities($html_org2) .'</em>'."\n"; print '<br /> NEW: <em>'. htmlentities($html_new2) .'</em>'."\n"; print '<br /> ALT: <u>'. $alt_value2 .'</u>'."\n"; print '<br /> '."\n"; // -------------------------------------------------------- // -------------------------------------------------------------------- ?>
Ausgabe:
OLD: Bla bla <img src="xyz" alt="Mein "Hut" der hätte "fünf" Ecken" border="0" /> blabla NEW: Bla bla <img src="xyz" alt="Mein Hut der hätte fünf Ecken" /> blabla ALT: Mein Hut der hätte fünf Ecken OLD: Bla bla <img src="abc" alt="Meine "Nase" die hätte "zwölf" Ecken"> blabla NEW: Bla bla <img src="abc" alt="Meine Nase die hätte zwölf Ecken"> blabla ALT: Meine Nase die hätte zwölf Ecken
funktioniert, aber nur wenn img TAG nach dem alt Attribut
nur noch
oder/>
endetborder="0" />
wenn aber andere Attribute auf alt folgen (title="" oder andere) dann ... FAIL
edit: jetzt auch egal ob
oder/>
am Ende>
durch das letzte Fragezeichen hier:'/alt="(.*?)"+?\s?\/?>/uis'
:=)
PS: ... wie BLÖD muss man sein, dass man in seinem RSS-Feed
bei <content:encoded> einen falschen / fehlerhaften HTML Code im IMG liefert.
sogar Anfänger wissen, wie wichtig Anführungszeichen in HTML-Tags sind,
und die Tagesschau RSS ist ja kein Neuling ... das denen so was passiert ... Lach
:P
Beitrag zuletzt geändert: 21.10.2015 10:35:49 von opsuche -
Hi "Simple HTML Dom" ist cool :D
http://simplehtmldom.sourceforge.net/
Beitrag zuletzt geändert: 3.11.2015 18:48:33 von buergerforum -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage