Avatar billede madsens90 Praktikant
23. december 2009 - 16:42 Der er 7 kommentarer og
1 løsning

Brug af preg_replace og regex. Overfør del fra "pattern" til "replacement?

Hej eksperter.

Mit problem var halv akavet at skulle beskrive i titlen, men her kommer et lidt bedre forsøg.

Jeg har en side hvorpå at en bruger kan skrive lidt om sig selv, og har besluttet mig for at tillade følgene tags:

<b></b>
<i></i>
<u></i>
<br />
og
<a target="_blank" href="http://">LINK</a>

Når min bruger gemmer teksten om ham selv, bliver alle "<" udskiftet med "[", og alle ">" udskiftet med "]".
På den måde sikre jeg mig at alle tags stadig er der men er ubrugelige.

Når teksten så bliver hentet ned fra min MySQL DB, bytter den følgene ting ud:

= <b></b>
= <i></i>
= <u></u>
[br /] = <br />

og HER er jeg så gået i stå, da jeg skal til at lave linket om til html igen, da et link varierer pga hvad brugeren sætter ind.

De andre ting er ret simple, og jeg har blot brugt f.eks:

$whoami = str_replace("[b]", "<b>", $whoami);

til at få skiftet en del af det ud.

Et link kan jo både være
[a target="_blank" href="http://google.dk"]Google link[/a]
såvel som det kan være
[a target="_blank" href="http://facebook.dk"]facebook link[/a]

Hvordan gør jeg linket til HTML igen?
Har lusket mig frem til at jeg måske kan bruge regex, og er kommet frem til følgene kode:

$whoami = preg_replace("/\[a.*target\=\"_blank\".*href\=\".*\".*\].*\[\/a\]/", "<a target=\"_blank\" href=\".*\">.*</a>", $whoami);

Jeg prøver altså at blot at udskifte < med [, og ] med >, dog kun hvor der er angivne tags.

Can anyone help me?
Hvis jeg ikke har forklaret problemet godt nok, eller det er dårligt forklaret, så sig endelig til!!

Tak på forhånd!
- Christian
Avatar billede arne_v Ekspert
23. december 2009 - 17:23 #1
Hurtigt forsoeg:

<?php
function test($s) {
    echo $s . "\r\n";
    $s2 = preg_replace('#(\[a\s+target\s*=\s*"_blank"\s+href\s*=\s*")([^"]*)("\s*\])([^[]*)(\[/a\])#', '<a target="_blank" href="$2">$4</a>', $s);
    echo $s2 . "\r\n";
}

test('[a target="_blank" href="http://google.dk"]Google link[/a]');
test('[a target="_blank" href="http://facebook.dk"]facebook link[/a]');
?>
Avatar billede phliplip Nybegynder
26. december 2009 - 10:16 #2
Det ligner jo simpel BBcode, så en hurtig søgning på bbcode parser på google resulterede i følgende.

function bbcode_format($str){
  // Convert all special HTML characters into entities to display literally
  $str = htmlentities($str);
  // The array of regex patterns to look for
  $format_search =  array(
      '#\[b\](.*?)\[/b\]#is', // Bold (text
      '#\[i\](.*?)\[/i\]#is', // Italics (text
      '#\[u\](.*?)\[/u\]#is', // Underline (text)
      '#\[s\](.*?)\[/s\]#is', // Strikethrough ([s]text[/s])
      '#\[quote\](.*?)\[/quote\]#is', // Quote ([quote]text[/quote])
      '#\[code\](.*?)\[/code\]#is', // Monospaced code [code]text[/code])
      '#\[size=([1-9]|1[0-9]|20)\](.*?)\[/size\]#is', // Font size 1-20px text)
      '#\[color=\#?([A-F0-9]{3}|[A-F0-9]{6})\](.*?)\[/color\]#is', // Font color (text)
      '#\(.*?)\[/url\]#i', // Hyperlink with descriptive text (text)
      '#\[url\]((?:ftp|https?)://.*?)\[/url\]#i', // Hyperlink ([url]http://url)
      '#\[img\](https?://.*?\.(?:jpg|jpeg|gif|png|bmp))\[/img\]#i' // Image (http://url_to_image)
  );
  // The matching array of strings to replace matches with
  $format_replace = array(
      '<strong>$1</strong>',
      '<em>$1</em>',
      '<span style="text-decoration: underline;">$1</span>',
      '<span style="text-decoration: line-through;">$1</span>',
      '<blockquote>$1</blockquote>',
      '<pre>$1</'.'pre>',
      '<span style="font-size: $1px;">$2</span>',
      '<span style="color: #$1;">$2</span>',
      '<a href="$1">$2</a>',
      '<a href="$1">$1</a>',
      '<img src="$1" alt="" />'
  );
  // Perform the actual conversion
  $str = preg_replace($format_search, $format_replace, $str);
  // Convert line breaks in the <br /> tag
  $str = nl2br($str);
  return $str;
}
Avatar billede arne_v Ekspert
10. januar 2010 - 04:21 #3
christian ?
Avatar billede madsens90 Praktikant
11. januar 2010 - 10:09 #4
Beklager ventetiden guys!!

Startede ud med arne_v's forslag, og må indrømme jeg aldrig kom videre, for det fungerede PERFEKT. ! :D

Script:

<?php
function test($s) {
    echo $s . "\r\n";
    echo "<br />";
    $s2 = preg_replace('#(\[a\s+target\s*=\s*"_blank"\s+href\s*=\s*")([^"]*)("\s*\])([^[]*)(\[/a\])#', '<a target="_blank" href="$2">$4</a>', $s);
    echo $s2 . "\r\n";
}

$test = 'This is just another good test!! [a target="_blank" href="http://www.google.dk"]Google link[/a]';

test($test);
?>

Resultat:

This is just another good test!! (GOOGLE LINK)


hvor (GOOGLE LINK), selvfølgelig er linket. ;)

beklager phliplip at jeg aldrig fik afprøvet BBcode, da det ikke var nødvendigt. Men tak alligevel for svaret. :)

Arne_v. Kom med et svar! :)
Avatar billede madsens90 Praktikant
11. januar 2010 - 10:18 #5
Arne_v
Det var forresten i øvrigt jo ret simpelt (ikke at jeg er mindre taknemmelig).
Var ikke klar over at man kunne bruge variablerne på den måde som du har gjort med $2 og $4.. Er jeg ikke "faldet" over nogle steder når jeg har læst.

Ved du tilfældigvis hvor jeg kan få lidt viden om det? ;) Eller bare hvad det hedder, så jeg kan finde noget om det?
Avatar billede arne_v Ekspert
11. januar 2010 - 15:02 #6
svar
Avatar billede arne_v Ekspert
11. januar 2010 - 15:03 #7
Det er en af de ting man normalt kan i regex.

Det er faktisk naevnt i eksempel #1 i http://us.php.net/manual/en/function.preg-replace.php
Avatar billede madsens90 Praktikant
11. januar 2010 - 15:55 #8
Det er det da os. :) Mine øjne der har sprunget det helt over. ;)
Tak for hjælpen!
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