kostenloser Webspace werbefrei: lima-city


Anführungszeichen aus img alt entfernen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    opsuche

    opsuche hat kostenlosen Webspace.

    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
    alt="
    und
    " />
    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. j*********r

    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... :wink:.

    mfg
    Jonas
  4. Autor dieses Themas

    opsuche

    opsuche hat kostenlosen Webspace.

    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
    border="0"
    mit im Treffer



    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 ?
  5. j*********r

    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
    border="0"
    mit im Treffer

    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
  6. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Was du noch tun könntest: dein Attribut sieht ja ca so aus:
    alt="ein "Attribut" mit ALT-Text"
    Jetzt könntest du auf alles, was nicht mit
    =
    anfängt, aber als nächstes ein
    "
    hat, bis zum nächsten
    "
    matchen. Das würde in diesem Fall nur noch
    "Attribut"
    ergeben. Da ersetzt du die
    "
    durch
    &quot;
    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
    ein "text mit "Anführungszeichen" usw"
    den Teil
    "text mit "A
    liefern. Da ersetzt du das 2.
    "
    durch ein
    &quot;
    . Das gleiche machst du jetzt noch für die umgekehrte Richtung, und du erhälst aus
    ein "text mit "Anführungszeichen" usw"
    das:
    ein "text mit &quot;anführungszeichen&quot; usw"
    Das wäre eigentlich genau das was du willst, und das funktioniert sogar ganz ohne Kenntnis der Tag-Struktur, Attribut-Tags o.ä.
  7. Autor dieses Themas

    opsuche

    opsuche hat kostenlosen Webspace.

    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 /> &nbsp;'."\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 /> &nbsp;'."\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
    border="0" />
    endet
    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
  8. b**********m

    Hi "Simple HTML Dom" ist cool :D

    http://simplehtmldom.sourceforge.net/

    Beitrag zuletzt geändert: 3.11.2015 18:48:33 von buergerforum
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!