[PHP] Preg_match vraag tbv wiki links

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • chaozz
  • Registratie: Juni 2000
  • Laatst online: 29-08 01:01

chaozz

Retrofiel

Topicstarter
Ik heb een functie die bepaalde codes omzet naar html, zoals smileys en beperkte html opmaak zoals kleur, font opmaak etc. Nu heb ik het idee gevat om wiki functionaliteit in mn spel te bouwen. Spelers kunnen simpelweg door [[ en ]] om een woord te zetten in een forum post een link triggeren naar een (wel of niet bestaand) wiki artikel.

De regel die ik daarvoor heb bedacht is:
PHP:
1
$text = preg_replace("#\[\[([a-zA-Z0-9\s]*?)\]\]#si","<a href=\"?h=wiki&wiki=$1\">$1</a>", $text);


Die code werkt prima, alleen wil ik het volgende. Ik wil dat als iemand schrijft: "To get a hackers IP you can [[Hire A Hacker]]" dat de spaties in de link naar de wiki worden vervangen (de eerste $1 in de code) door een underscore, maar dat de tekst die gelinkt wordt gewoon met spaties wordt weergegeven (de tweede $1 in de code).

Ik kan met google niet zoveel vinden over het combineren van replace met preg_match. Kan iemand me opweg helpen?

chaozz.nl | RetroGameCouch


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik ben geen PHP kenner, maar ik denk dat je eens moet kijken naar preg_replace_callback.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 19-09 11:00

Ventieldopje

I'm not your pal, mate!

PHP:
1
$text = preg_replace("#\[\[([a-zA-Z0-9\s]*?)\]\]#si","<a href=\"?h=wiki&wiki=" . str_replace(' ', '_', $1) . "\">$1</a>", $text);


Zoiets?

Mocht dat niet werken kun je dit nog proberen (bij str_replace).

PHP:
1
str_replace(' ', '_', "$1")

[ Voor 27% gewijzigd door Ventieldopje op 10-03-2011 14:22 ]

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • chaozz
  • Registratie: Juni 2000
  • Laatst online: 29-08 01:01

chaozz

Retrofiel

Topicstarter
PHP:
1
$text = preg_replace("#\[\[([a-zA-Z0-9\s]*?)\]\]#si","<a href=\"?h=wiki&wiki=" . str_replace(' ', '_', $1) . "\">$1</a>", $text);


Zorgt voor een syntax fout in de code

PHP:
1
$text = preg_replace("#\[\[([a-zA-Z0-9\s]*?)\]\]#si","<a href=\"?h=wiki&wiki=" . str_replace(' ', '_', "$1") . "\">$1</a>", $text);


Vervangt geen spaties in $1.


edit: Ik bedacht nog

PHP:
1
2
3
4
5
$wiki_pattern[0] = "#\[\[([a-zA-Z0-9\s]*?)\]\]#si";
$wiki_pattern[1] = "/\s/e";
$wiki_replace[0] = "<a href=\"?h=wiki&wiki=$1\">$1</a>";
$wiki_replace[1] = "_";
if (preg_match($wiki_pattern[0], $text)) $text = preg_replace($wiki_pattern, $wiki_replace, $text);


Dat werkt, maar vervangt alle spaties door underscores in de gehele tekst. Dat is nou weer net niet de bedoeling.

[ Voor 36% gewijzigd door chaozz op 10-03-2011 16:40 ]

chaozz.nl | RetroGameCouch


Acties:
  • 0 Henk 'm!

  • chaozz
  • Registratie: Juni 2000
  • Laatst online: 29-08 01:01

chaozz

Retrofiel

Topicstarter
RobIII schreef op donderdag 10 maart 2011 @ 12:53:
Ik ben geen PHP kenner, maar ik denk dat je eens moet kijken naar preg_replace_callback.
Head on the nail!

PHP:
1
2
3
4
5
6
7
8
    Function replace_spaces ($text) {
        return "<a href=\"?h=wiki&wiki=".str_replace(" ", "_", $text[1])."\">".$text[1]."</a>";
    }
    Function replaceBBC($text){
        $text = preg_replace("#\[quote\](.*?)\[/quote\]#si","<blockquote><p>$1</p></blockquote>", $text);
        $text = preg_replace_callback("#\[\[([a-zA-Z0-9\s]*?)\]\]#si",'replace_spaces', $text);

// knip


Werkt uitstekend. Bedankt! :)

chaozz.nl | RetroGameCouch