Avatar billede supermand69 Nybegynder
05. marts 2005 - 21:04 Der er 49 kommentarer og
1 løsning

preg replace

'/(^| ):\-?\)/im' => '\\1<div style="xxx"></div>'

jeg mangler noget i min expression

hvis der forekommer et mellemrum foran eller bagefter min smiley :) skal de erstattes med &nbsp;

eks.
':)' => '<div></div>'
' :)' => '&nbsp;<div></div>'
':) ' => '<div></div>&nbsp;'
' :) ' => '&nbsp;<div></div>&nbsp;'
Avatar billede knudx Nybegynder
05. marts 2005 - 21:32 #1
kan du ikke bruge 'capturing groups' à la

'/(^| ):\-?\)( )?/im' => '$1<div style="xxx"></div>$2'

???
Avatar billede supermand69 Nybegynder
05. marts 2005 - 21:35 #2
jeg er ikke helt med?
Avatar billede knudx Nybegynder
05. marts 2005 - 22:10 #3
hmm - det kan jeg egentlig godt forståe...
Er du vant til at bruge regular expressions?
Hvordan ser dit kald fra php ud? Når der er ting i pattern'et som er i ()paranteser kan de genbruges i replacement-strengen vha $1, $2 osv. Pas på med $-tegnet, hvis det er en "" streng skal den backslashes.
Avatar billede supermand69 Nybegynder
05. marts 2005 - 22:16 #4
jeg er ikke vildt god til reg exp..

$SMILEY = array(
    '/(^| ):\-?\)/im' => '\\1<div style="height:13px; width:13px; background:url(gfx/smiley.smile.png)"></div>',
    '/(^| );\-?\)/im' => '\\1<div style="height:13px; width:13px; background:url(gfx/smiley.wink.png)"></div>',
    '/(^| ):\-?d/im' => '\\1<div style="height:13px; width:13px; background:url(gfx/smiley.laugh.png)"></div>',
    '/(^| ):\-?p/im' => '\\1<div style="height:13px; width:13px; background:url(gfx/smiley.tongue.png)"></div>',
    '/(^| ):\-?\//im' => '\\1<div style="height:13px; width:13px; background:url(gfx/smiley.think.png)"></div>',
    '/(^| ):\-?\|/im' => '\\1<div style="height:13px; width:13px; background:url(gfx/smiley.disappointed.png)"></div>',
    '/(^| ):\-?\(/im' => '\\1<div style="height:13px; width:13px; background:url(gfx/smiley.sad.png)"></div>',
    '/(^| ):\-?o/im' => '\\1<div style="height:13px; width:22px; background:url(gfx/smiley.sleep.png)"></div>',
    '/(^| ):\-?x/im' => '\\1<div style="height:13px; width:13px; background:url(gfx/smiley.dead.png)"></div>'
);

preg_replace(array_keys($SMILEY), array_values($SMILEY), $str);
Avatar billede knudx Nybegynder
05. marts 2005 - 22:33 #5
aah, jeg kan se at \1 også er en 'backreference' - jeg tror du skal lave dem sådan her:
'/(^| ):\-?\)([\s]?)/im' => '$1<div style="height:13px; width:13px; background:url(gfx/smiley.smile.png)"></div>$2'

tilføjet ([\s]?) som gerne skulle tage et mellemrum efter smileyen, og putte det ind i $2...
Meeen, jeg er heller ikke super garvet, men det plejer at kunne lade sig gøre hvis man bare hekser lidt med det..
Avatar billede supermand69 Nybegynder
05. marts 2005 - 23:01 #6
hvad mener du med backreference?

hvad er forskellen på \\1 og $1??
Avatar billede supermand69 Nybegynder
05. marts 2005 - 23:01 #7
desuden er det ikke nok kun at lave et mellemrum... det SKAL være &nbsp; :)
Avatar billede knudx Nybegynder
06. marts 2005 - 14:22 #8
"\\1" og "\$1" betyder det samme - nemlig en backreference. De refererer til ()-grupper i det regulære udtryk, i dette tilfælde (^| ) og ([\s]?), som begge måske er et mellemrum, måske ingenting.

>> desuden er det ikke nok kun at lave et mellemrum... det SKAL være &nbsp; :)
Du har ret, du skal nok bruge preg_replace_callback i stedet for preg_replace.

noget i retning af
function smiley_callback ($m) {
  $rval = "";
  if ($m[1]!='') $rval .= '&nbsp';
  $style=array (
    ':-)' => '<div style="height:13px; width:13px; background:url(gfx/smiley.smile.png)"></div>',
    ';-)' => '<div style="height:13px; width:13px; background:url(gfx/smiley.wink.png)"></div>'
  );
  $rval .= $style[$m[2]];
  if ($m[3]!='') $rval .= '&nbsp';
  return $rval;
}

echo preg_replace_callback ('/(^| )([;:]\-?[\\\|\/\)\(spdSPD])(\s?)/im', 'smiley_callback', $str);

----------hvis du kan se hvad jeg mener
Avatar billede knudx Nybegynder
06. marts 2005 - 14:26 #9
nemmere:

function smiley_callback ($m) {
  $rval = "";
  if ($m[1]!='') $rval .= '&nbsp';
  $style=array (
    ':-)' => 'smile',
    ':)' => 'smile',
    ';-)' => 'wink'
    /*...der skal fyldes ud...*/
  );
  $rval .= '<div style="height:13px; width:13px; background:url(gfx/smiley.'.$style[$m].'.png)"></div>';
  if ($m[3]!='') $rval .= '&nbsp';
  return $rval;
}

echo preg_replace_callback ('/(^| )([;:]\-?[\\\|\/\)\(spdSPD])(\s?)/im', 'smiley_callback', $str);
Avatar billede knudx Nybegynder
06. marts 2005 - 14:26 #10
aah fuck
Avatar billede knudx Nybegynder
06. marts 2005 - 14:27 #11
$style[$m[2]]
Avatar billede supermand69 Nybegynder
07. marts 2005 - 23:01 #12
jeg ser lige på det :)

vender tilbage om et par dage, for jeg har lidt travlt
Avatar billede supermand69 Nybegynder
15. marts 2005 - 19:38 #13
jeg må altså lige be dig om at skære det ud i pap :) jeg fatter ikke rigtig noget af det kode du har skrevet...
Avatar billede supermand69 Nybegynder
20. marts 2005 - 01:32 #14
hvad gør \s ??

i den preg du har lavet SKAL der være - med i min smiley før den bliver lavet
Avatar billede supermand69 Nybegynder
20. marts 2005 - 02:53 #15
jeg er kommet frem til følgende, men det virker stadig ikke som det skal :(

når der står /im er det så stadig nødvendigt at have både store og små bogstaver med?

function smiley_callback($m)
{
    $smiley = array(
        '/:\-?\)/im' => '<div style="height:13px; width:13px; background:url(gfx/smiley.smile.png)"></div>',
        '/;\-?\)/im' => '<div style="height:13px; width:13px; background:url(gfx/smiley.wink.png)"></div>',
        '/:\-?d/im' => '<div style="height:13px; width:13px; background:url(gfx/smiley.laugh.png)"></div>',
        '/:\-?p/im' => '<div style="height:13px; width:13px; background:url(gfx/smiley.tongue.png)"></div>',
        '/:\-?\//im' => '<div style="height:13px; width:13px; background:url(gfx/smiley.think.png)"></div>',
        '/:\-?\|/im' => '<div style="height:13px; width:13px; background:url(gfx/smiley.disappointed.png)"></div>',
        '/:\-?\(/im' => '<div style="height:13px; width:13px; background:url(gfx/smiley.sad.png)"></div>',
        '/:\-?o/im' => '<div style="height:13px; width:22px; background:url(gfx/smiley.sleep.png)"></div>',
        '/:\-?x/im' => '<div style="height:13px; width:13px; background:url(gfx/smiley.dead.png)"></div>'
    );
   
    if($m[1] != '') $rval .= '&nbsp;';
   
    $rval .= preg_replace(array_keys($smiley), array_values($smiley), $m[2]);
   
    if($m[3] != '') $rval .= '&nbsp;';
   
    return $rval;
}
Avatar billede knudx Nybegynder
22. marts 2005 - 19:01 #16
1.>> hvad gør \s ??
- det er et mellemrum

2.>> i den preg du har lavet SKAL der være - med i min smiley før den bliver lavet
- Det *burde* ikke være nødvendigt, "\-?" er "nul eller ingen -"

3.>> når der står /im er det så stadig nødvendigt at have både store og små bogstaver med?
- nææ, det har du ret i, i'et står for 'case Insensitive'. Så det skulle faktisk være '/(^| )([;:]\-?[\\\|\/\)\(spdx])(\s?)/im', eller '/(^| )([;:]\-?[\\\|\/\)\(dpox])(\s?)/im', alt efter hvilke du vil understøtte.

4. Ideen i preg_replace_callback er at du kan være mere selektiv med hensyn til hvad der bliver erstattet med - funktionen (eks. smiley_callback) modtager som argument et array, hvor [0] er hele matchet (eks. smiley'en), og [1], [2] etc er de 'underinddelinger' du har lavet i dit regex vha () paranteser.  Der er m.a.o. ingen grund til at kalde preg_replace INDEN I smiley_callback, da du her har resultatet som $m[2]. Min ide er at lave et array, hvor hver enkelt smiley - som streng - er 'key' til den tilhørende billedfil.. altså
  $style=array (
    ':-)' => 'smile',
    ':)' => 'smile',
    ';-)' => 'wink'
    /*...der skal fyldes ud...*/
  );
som du ser er der to der peger på 'smile', én med og én uden bindestreg.

C.U. -J:^)
Avatar billede supermand69 Nybegynder
23. marts 2005 - 16:46 #17
i dit forslag SKAL der være - med før det virker :(
Avatar billede knudx Nybegynder
23. marts 2005 - 19:57 #18
Nej. Nu har jeg testet lidt... Problemet er mellemrummene, og formuleringen (^| ) - hvis jeg skriver (\s?) i stedet for både først og sidst virker det.

<?php
function smiley_callback ($m) {
  $rval = "";
  if ($m[1]!='') $rval .= '&nbsp';
  $style=array (
    ':-)' => 'smile',
    ':)' => 'smile',
    ';-)' => 'wink',
    ';)' => 'wink'
    /*...der skal fyldes ud...*/
  );
  $rval .= '['.$style[$m[2]].']';
  if ($m[3]!='') $rval .= '&nbsp';
  return $rval;
}

$str=";) hej meddig;-)  :-) :)";
echo preg_replace_callback ('/(\s?)([;:]\-?[\\\|\/\)\(spdox])(\s?)/im', 'smiley_callback', $str);
?>

ligger på http://www.krimskrams.dk/test/preg.php

-J.^)
Avatar billede knudx Nybegynder
23. marts 2005 - 21:41 #19
Det virker som om den også får dine &nbsp; 'er med nu-- men der er stadig potentielle problemer - fx vil "ftp://" blive til en mellemfornøjet... Evt ku' man bruge \b, som står for "word boundary", men det kan jeg ikke rigtig få til at virke.

Joe Regex'ene kan være tricky at have med at gøre...
Avatar billede supermand69 Nybegynder
24. marts 2005 - 11:56 #20
det ser ud til at det nogenlunde virker nu, men det er ikke alle mine smilies som virker :(

function smiley_callback($var)
{
    $trans_arr = array(
        '/:\-?\)/i' => 'height:13px; width:13px; background:url(gfx/smiley.smile.png)',
        '/;\-?\)/i' => 'height:13px; width:13px; background:url(gfx/smiley.wink.png)',
        '/:\-?d/i' => 'height:13px; width:13px; background:url(gfx/smiley.laugh.png)',
        '/:\-?p/i' => 'height:13px; width:13px; background:url(gfx/smiley.tongue.png)',
        '/:\-?\//i' => 'height:13px; width:13px; background:url(gfx/smiley.think.png)',
        '/:\-?\|/i' => 'height:13px; width:13px; background:url(gfx/smiley.disappointed.png)',
        '/:\-?\(/i' => 'height:13px; width:13px; background:url(gfx/smiley.sad.png)',
        '/:\-?o/i' => 'height:13px; width:22px; background:url(gfx/smiley.sleep.png)',
        '/:\-?x/i' => 'height:13px; width:13px; background:url(gfx/smiley.dead.png)'
    );
   
    if($var[1] != '') $str .= '&nbsp;';
   
    $str .= '<div style="'.preg_replace(array_keys($trans_arr), array_values($trans_arr), $var[2]).'"></div>';
   
    if($var[3] != '') $str .= '&nbsp;';
   
    return $str;
}

$str = ":-) hehe :)\nhej ;) ftp:// hej:) :)hey";

echo preg_replace_callback('/(^|\s)([:;]\-?[\)\(\\\|pdox])(\s|$)/im', 'smiley_callback', $str);
Avatar billede supermand69 Nybegynder
24. marts 2005 - 15:15 #21
hov... jeg havde lavet en lille fejl, men der er stadig nogle af mine smilies som ikke virker :(

http://clark.avansis.dk/test/smilies/
Avatar billede knudx Nybegynder
24. marts 2005 - 22:10 #22
joe, det går da fremad... men satdigvæk: det er spild af krudt at kalde preg_replace inde fra din callback! Du må kunne finde på noget smartere... Jeg kan godt se at det virker lidt tåbeligt at have den der array med to ting der peger på det samme, men det er i hvert fald bedre end den anden måde... Ikke mindst mht kode-effektivitet. Regex koster processortid.

;^J
Avatar billede supermand69 Nybegynder
26. marts 2005 - 21:04 #23
ok...

men hvorfor er det ikke alle mine smilies der virker? det ser da ellers rigtigt ud?
Avatar billede supermand69 Nybegynder
26. marts 2005 - 22:32 #24
arh fuck... det virker jo ikke fordi mellemrummene bliver lavet om til &nbsp;

hvad kan jeg gøre? :(
Avatar billede knudx Nybegynder
27. marts 2005 - 23:13 #25
jeps problemet er mellemrummene... SKAL der være mellemrum mellem smilies og ord? Hvis der skal, vil f.eks. "vi ses:)" ikke blive erstattet, hvilket jo er synd, hvis der ikke skal, får du problemet med "http://gedebuk.net" eller lign. Det kunne man dog hacke sig ud af, vha noget emre preg stads.. prøver lige...
Avatar billede supermand69 Nybegynder
27. marts 2005 - 23:19 #26
altså... selve funktionen virker fint, lige på nær at man ikke kan lave flere smilies lige efter hinanden

nej "hej med dig:)", "http://noget" og lign. skal ikke erstattes :)
Avatar billede knudx Nybegynder
27. marts 2005 - 23:22 #27
Yep, den kører.. En 'hurtig' betingelse om at der ikke må komme en / efter smilien... Nu er reg-ex'et: '/(\s?)([;:]\-?[\\\|\/\)\(spdox])(\s?)(?!\/)/im'

Stadig http://www.krimskrams.dk/test/preg.php, men nu er test strengen ";) hej meddig;-)  :-) :) : ):) proev via ftp://google.com"
Avatar billede knudx Nybegynder
27. marts 2005 - 23:24 #28
På den måde behøver du heller ikke matche '&nbsp;'; Hvis det står der, bliver det bare stående, men hvis der er et mellemrum, kommer der i stedet '&nbsp;'.
Avatar billede knudx Nybegynder
27. marts 2005 - 23:26 #29
Lægger lige showsource ind i min...
Avatar billede supermand69 Nybegynder
27. marts 2005 - 23:42 #30
jeg ville egentlig gerne have at "hej med dig:)" ikke blev erstattet - altså så der SKAL være mellemrum mellem smilies og tekst

http://clark.avansis.dk/test/smilies/index2.php

\s tager jo alle whitespaces som et :( se i mit eksempel jeg har taget fra dig hvor jeg har lavet et break i stringen... der kommer et mellemrum foran smileyen i linje to

ja, det kan godt være det er at gå i detaljer, men vil gerne have så det virker 100% :)
Avatar billede knudx Nybegynder
28. marts 2005 - 00:17 #31
jeg kan godt se det med break-- det ser åndssvagt ud at en linie starter med et mellemrum.
Så er problemet at mellemrummene bliver 'spist' så de ikke er der til næste match. Hvad med det her:
Matche mellemrummet før smilien, men ikke bagefter: så du skal bruge ( |^) foran og (?= |&nbsp;|\n|<) (lookahead, se http://dk2.php.net/manual/da/reference.pcre.pattern.syntax.php) bagefter... Samme url igen ;^J
Avatar billede supermand69 Nybegynder
28. marts 2005 - 00:31 #32
jeg ser lige på det i morgen... er ved at være lidt for træt :)
Avatar billede supermand69 Nybegynder
28. marts 2005 - 12:31 #33
hvorfor er der ?= med i den sidste gruppe?
Avatar billede knudx Nybegynder
28. marts 2005 - 17:07 #34
'/( |&nbsp;|^)([;:]\-?[\\\|\/\)\(spdox])(?= |&nbsp;|\n|<)/im'

(?= |&nbsp;|\n|<) betyder at der SKAL komme mellemrum, newline eller < (html-tag) (- altså " |&nbsp;|\n|<") efter smilien for at matchen bruges. Mellemrummet kommer ikke med i matchen som gruppe, så linien med $m[3] skal faktisk slettes fra php-koden, se http://www.krimskrams.dk/test/preg.php igen-igen...
Avatar billede supermand69 Nybegynder
28. marts 2005 - 20:18 #35
her er din kode smidt ind... men nu laver den jo ikke &nbsp; efter smilies

http://clark.avansis.dk/test/smilies/index2.php
Avatar billede supermand69 Nybegynder
28. marts 2005 - 20:24 #36
hvorfor kan den ikke finde ud at at matche &nbsp; ??
Avatar billede supermand69 Nybegynder
28. marts 2005 - 20:27 #37
- for i princippet burde den her jo virke http://clark.avansis.dk/test/smilies/
Avatar billede supermand69 Nybegynder
28. marts 2005 - 20:56 #38
jeg har droppet gruppe 1 i stedet for, og nu ser det ud til at virke... :)

http://clark.avansis.dk/test/smilies/
Avatar billede knudx Nybegynder
28. marts 2005 - 23:15 #39
joe, --- men nu laver den vel så ikke &nbsp; FØR smilies !?! Plus at hej:) bliver matchet nu!

Hos mig ser det nu ikke ud til at der er problemer med at matche &nbsp; !?!
'/( |&nbsp;|^)([;:]\-?[\\\|\/\)\(spdox])( |&nbsp;|$|(?=<))/im' virker tilsyneladende også fint.
Avatar billede supermand69 Nybegynder
28. marts 2005 - 23:20 #40
ja, jeg ved godat at den tager hej:) med - men kunne ikke lige finde andre løsninger

kan du ikke lige prøve at lave din version med det sidste du skrev? :)
Avatar billede knudx Nybegynder
28. marts 2005 - 23:39 #41
det er det allerede -- ændret lidt i teststrengen også, men det kan du jo se i showsource !

Go' nat, og happy hacking... ;^J
Avatar billede supermand69 Nybegynder
28. marts 2005 - 23:54 #42
den laver indryk og tager ikke den sidste :o med

http://clark.avansis.dk/test/smilies/index2.php

jeg har kopieret din kode ind med mine smilies
Avatar billede knudx Nybegynder
29. marts 2005 - 00:12 #43
mangler (?<=>) i ( |&nbsp;|^), check mit test eks. igen. Laver indryk forstår jeg ik hvad du mener, jeg kan ikke se billederne på din test... Ka' du ikke indsætte <html> og <head> ? Jeg bruger ikke Explorer... hjemme i hvert fald.

Men nu SKAL jeg altså i seng!
Avatar billede knudx Nybegynder
29. marts 2005 - 00:12 #44
Avatar billede knudx Nybegynder
29. marts 2005 - 00:15 #45
Avatar billede knudx Nybegynder
29. marts 2005 - 00:15 #46
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Avatar billede knudx Nybegynder
31. marts 2005 - 23:41 #47
altså
preg_replace_callback ('/( |&nbsp;|^|(?<=>))([;:]\-?[\\\|\/\)\(spdox])( |&nbsp;|$|(?=<))/im', 'smiley_callback', $str)
nu... Er den ved at være der?
Avatar billede supermand69 Nybegynder
02. april 2005 - 21:45 #48
jeg vender lige tilbage om et par dage :)
Avatar billede supermand69 Nybegynder
11. september 2005 - 15:51 #49
knudx > lav et svar :)
Avatar billede supermand69 Nybegynder
16. september 2005 - 21:16 #50
lukker
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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