Avatar billede fixxxer Nybegynder
21. august 2005 - 22:49 Der er 19 kommentarer og
1 løsning

preg_replace img-tag

Jeg har svært ved at få en reg. expr til at fungere:

Jeg vil erstatte alle img-tag hvor værdien src slutter på fx "smily-cry.gif":

<img (.*?) src="(.*?)smiley-cry.gif">

Den skal også tage højde for at der kan være skrevet værdier ind før src. Hvad skal jeg gøre for at få ovenstående til at virke?
Avatar billede nielle Nybegynder
21. august 2005 - 22:55 #1
Hvis der ikke er noget immellem img og src vil dit pattern krøve at der er to blanktegn. Det er der næppe , så prøv f.eks. med denne:

<img (.*?)\s*src="(.*?)smiley-cry.gif">
Avatar billede erikjacobsen Ekspert
21. august 2005 - 22:55 #2
Du må gerne vise hvad du har prøvet, og hvorfor det ikke virker.
Men
  (.*?)smiley-cry.gif"> 
er nok lidt for generel, da den kan smutte vilkårligt langt frem i søgen efter smiley-cry. Prøv at erstatte
  (.*?)
med
  ([^>]*)
så du er sikker på den stopper når dit img-tag er færdigt.
Avatar billede fixxxer Nybegynder
21. august 2005 - 22:57 #3
Jeg har prøvet følgende:

function emoctions2acsii($msg_text)
{
    $_VALID_SMILIES            = array('smiley-cry.gif'=>':\'(', 'smiley-cool.gif'=>':)', 'smiley-embarassed.gif'=>':)', 'smiley-foot-in-mouth.gif'=>':)', 'smiley-frown.gif'=>':)', 'smiley-innocent.gif'=>':)', 'smiley-kiss.gif'=>':)', 'smiley-laughing.gif'=>':)', 'smiley-money-mouth.gif'=>':)', 'smiley-sealed.gif'=>':)', 'smiley-smile.gif'=>':)', 'smiley-surprised.gif'=>':)', 'smiley-tongue-out.gif'=>':)', 'smiley-undecided.gif'=>':)', 'smiley-wink.gif'=>':)', 'smiley-yell.gif'=>':)');

    $str = $msg_text;
   
    foreach ($_VALID_SMILIES as $key => $value)
    {
        $str = preg_replace('<img (.*?) src="(.*?)'.$key.'">', $value, $str);
    }
   
    return $str;
}
Avatar billede fixxxer Nybegynder
21. august 2005 - 23:02 #4
Jeg kan også se at der skal højde for at img-taget bliver skrevet fx sådan:

<img border=\"0\" src=\"/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-cool.gif\" />
Avatar billede nielle Nybegynder
21. august 2005 - 23:05 #5
Der er ganske rigtigt en meget vigtig detalje erikjacobsen kom med der.

Så vidt jeg kan bedømme så er det hele image-taggen m/ indhold som du vil have ændret til en tekst-version:

function emoctions2acsii($msg_text)
{
    $_VALID_SMILIES    = array('smiley-cry.gif'=>':\'(', 'smiley-cool.gif'=>':)', 'smiley-embarassed.gif'=>':)', 'smiley-foot-in-mouth.gif'=>':)', 'smiley-frown.gif'=>':)', 'smiley-innocent.gif'=>':)', 'smiley-kiss.gif'=>':)', 'smiley-laughing.gif'=>':)', 'smiley-money-mouth.gif'=>':)', 'smiley-sealed.gif'=>':)', 'smiley-smile.gif'=>':)', 'smiley-surprised.gif'=>':)', 'smiley-tongue-out.gif'=>':)', 'smiley-undecided.gif'=>':)', 'smiley-wink.gif'=>':)', 'smiley-yell.gif'=>':)');

    $str = $msg_text;
   
    foreach ($_VALID_SMILIES as $key => $value)
    {
        $str = preg_replace('/(<img .*?src="[^>]*?' . $key . '">)/i', $value, $str);
    }

    return $str;
}
Avatar billede nielle Nybegynder
21. august 2005 - 23:07 #6
Se venligst bort fra den forige kode - der var en pinlig fejl i. Brug denne:

function emoctions2acsii($msg_text)
{
    $_VALID_SMILIES    = array('smiley-cry.gif'=>':\'(', 'smiley-cool.gif'=>':)', 'smiley-embarassed.gif'=>':)', 'smiley-foot-in-mouth.gif'=>':)', 'smiley-frown.gif'=>':)', 'smiley-innocent.gif'=>':)', 'smiley-kiss.gif'=>':)', 'smiley-laughing.gif'=>':)', 'smiley-money-mouth.gif'=>':)', 'smiley-sealed.gif'=>':)', 'smiley-smile.gif'=>':)', 'smiley-surprised.gif'=>':)', 'smiley-tongue-out.gif'=>':)', 'smiley-undecided.gif'=>':)', 'smiley-wink.gif'=>':)', 'smiley-yell.gif'=>':)');

    $str = $msg_text;
   
    foreach ($_VALID_SMILIES as $key => $value)
    {
        $str = preg_replace('/(<img [^>]*src="[^>]*' . $key . '">)/i', $value, $str);
    }

    return $str;
}
Avatar billede fixxxer Nybegynder
21. august 2005 - 23:11 #7
Det virker ikke, og jeg vil tro at det skyldes mønsteret?

I dit script kigger du efter <img src="hvad/som/helst/smiley-cry.gif">

hvor det der skal erstattes på ser sådan ud:

<img src=\"hvad/som/helst/smiley-cry.gif\" />
Avatar billede erikjacobsen Ekspert
21. august 2005 - 23:13 #8
Din detalje var også vigtig, nielle, *g*. Tilføj lige muligheden for at afslutte som fx
1)    ...">
2)    ..."/>
3)    ..." />
Avatar billede nielle Nybegynder
21. august 2005 - 23:16 #9
function emoctions2acsii($msg_text)
{
    $_VALID_SMILIES    = array('smiley-cry.gif'=>':\'(', 'smiley-cool.gif'=>':)', 'smiley-embarassed.gif'=>':)', 'smiley-foot-in-mouth.gif'=>':)', 'smiley-frown.gif'=>':)', 'smiley-innocent.gif'=>':)', 'smiley-kiss.gif'=>':)', 'smiley-laughing.gif'=>':)', 'smiley-money-mouth.gif'=>':)', 'smiley-sealed.gif'=>':)', 'smiley-smile.gif'=>':)', 'smiley-surprised.gif'=>':)', 'smiley-tongue-out.gif'=>':)', 'smiley-undecided.gif'=>':)', 'smiley-wink.gif'=>':)', 'smiley-yell.gif'=>':)');

    $str = $msg_text;
   
    foreach ($_VALID_SMILIES as $key => $value)
    {
        $str = preg_replace('/(<img [^>]*src=\?"[^>]*' . $key . '\?"\s*\/?>)/i', $value, $str);
    }

    return $str;
}
Avatar billede fixxxer Nybegynder
21. august 2005 - 23:22 #10
Der kommer stadig et img-tag ud af den..

<img border=\"0\" src=\"/tiny_mce/plugins/emotions/images/smiley-cry.gif\" />
Avatar billede nielle Nybegynder
21. august 2005 - 23:23 #11
Prøv denne variation:

function emoctions2acsii($msg_text)
{
    $_VALID_SMILIES    = array('smiley-cry.gif'=>':\'(', 'smiley-cool.gif'=>':)', 'smiley-embarassed.gif'=>':)', 'smiley-foot-in-mouth.gif'=>':)', 'smiley-frown.gif'=>':)', 'smiley-innocent.gif'=>':)', 'smiley-kiss.gif'=>':)', 'smiley-laughing.gif'=>':)', 'smiley-money-mouth.gif'=>':)', 'smiley-sealed.gif'=>':)', 'smiley-smile.gif'=>':)', 'smiley-surprised.gif'=>':)', 'smiley-tongue-out.gif'=>':)', 'smiley-undecided.gif'=>':)', 'smiley-wink.gif'=>':)', 'smiley-yell.gif'=>':)');

    $str = stripslashes($msg_text);
   
    foreach ($_VALID_SMILIES as $key => $value)
    {
        $str = preg_replace('/(<img [^>]*src="[^>]*' . $key . '"\s*\/?>)/i', $value, $str);
    }

    return $str;
}
Avatar billede erikjacobsen Ekspert
21. august 2005 - 23:23 #12
Og du mener, der rent faktisk står \-ere foran "-erne? Hvorfor dog?
Avatar billede fixxxer Nybegynder
21. august 2005 - 23:24 #13
Ok, gennembrud..

Jeg kørte en stripslashes på $msg_text og skrev preg_replace om til:

$str = preg_replace('/(<img [^>]*src="[^>]*' . $key . '"\s*\/?>)/i', $value, $str);

Og nu erstatter den rigtigt.. så det er \ foran " den ikke kan håndtere?
Avatar billede fixxxer Nybegynder
21. august 2005 - 23:25 #14
Ja, det er noget som tinymce helt automatisk gør vil jeg tro..
Avatar billede fixxxer Nybegynder
21. august 2005 - 23:25 #15
erikjacobsen, du plejer at springe point over, så jeg skal bare bede nielle om at lægge et svar?
Avatar billede nielle Nybegynder
21. august 2005 - 23:27 #16
Svar :^)
Avatar billede fixxxer Nybegynder
21. august 2005 - 23:28 #17
Mange tak for hjælpen begge to!

Fortsat god aften :)
Avatar billede erikjacobsen Ekspert
21. august 2005 - 23:29 #18
Hvis din PHP er sat til automatisk "addslashes" og tinymce også gør det, ja så får du selvfølgelig den ekstra. Men det bør ikke være tilfældet. Et portabelt script(stump) bør checke om den automatiske er sat til, og så vælge ud fra det. Du er sikker på du ikke selv har en addslashes gemt et sted.... ?

Og så er "lektionen" igen nok, at man altid skal gemme inddata i så original form som muligt. Havde du gemt med ;) osv i stedet for <img>-tags, havde du haft færre problemer. Så skulle du så enten have lavet en substituering ved visning, eller yderligere have gemt et formatteret felt. Men måske er det igen tinymce der gør noget bag din ryg.

Whatever - jeg filosoferer bare lidt...
Avatar billede fixxxer Nybegynder
21. august 2005 - 23:36 #19
Jeg har rimelig styr på mit backend script, men jeg har ingen kontrol over i hvilken formatering tinymce komponentet sender data til server-side.

Man kan sikkert ændre dets indstillinger, men så meget har jeg ikke kigget på det..
Avatar billede fixxxer Nybegynder
21. august 2005 - 23:38 #20
Hvis i har nogen forslag til tegnudgavnet af disse smilies, så er de meget velkomne :-)

Jeg har det her indtil videre:

    $_VALID_SMILIES    = array('smiley-cry.gif'=>':\'(', 'smiley-cool.gif'=>':-)', 'smiley-embarassed.gif'=>'',
                                                        'smiley-foot-in-mouth.gif'=>'%', 'smiley-frown.gif'=>'', 'smiley-innocent.gif'=>'¤-)',
                                                        'smiley-kiss.gif'=>'', 'smiley-laughing.gif'=>'', 'smiley-money-mouth.gif'=>'$-)',
                                                        'smiley-sealed.gif'=>':|', 'smiley-smile.gif'=>':D', 'smiley-surprised.gif'=>':o',
                                                        'smiley-tongue-out.gif'=>':p', 'smiley-undecided.gif'=>'', 'smiley-wink.gif'=>';-)',
                                                        'smiley-yell.gif'=>'');
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester