I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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.
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..
"\\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 :) 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 .= ' '; $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 .= ' '; return $rval; }
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.
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.
Det virker som om den også får dine '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...
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.
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...
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'
På den måde behøver du heller ikke matche ' '; Hvis det står der, bliver det bare stående, men hvis der er et mellemrum, kommer der i stedet ' '.
\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% :)
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 (?= | |\n|<) (lookahead, se http://dk2.php.net/manual/da/reference.pcre.pattern.syntax.php) bagefter... Samme url igen ;^J
(?= | |\n|<) betyder at der SKAL komme mellemrum, newline eller < (html-tag) (- altså " | |\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...
joe, --- men nu laver den vel så ikke FØR smilies !?! Plus at hej:) bliver matchet nu!
Hos mig ser det nu ikke ud til at der er problemer med at matche !?! '/( | |^)([;:]\-?[\\\|\/\)\(spdox])( | |$|(?=<))/im' virker tilsyneladende også fint.
mangler (?<=>) i ( | |^), 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.
altså preg_replace_callback ('/( | |^|(?<=>))([;:]\-?[\\\|\/\)\(spdox])( | |$|(?=<))/im', 'smiley_callback', $str) nu... Er den ved at være der?
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.