[PHP] Replace ubb code

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Hoi,

Ik zit met een probleem. Ik heb een weblog geschreven en gebruik daar ubbcode voor. In het bericht kun je een link maken zoals deze:

code:
1
[url=http://www.pinkelotje.nl/sintmaarten.html#Sintemaarten had een muis] Sint Maarten Liedjes[/url]
maar dan wordt het zo getoont:
code:
1
[url=http://www.pinkelotje.nl/sintmaarten.html#Sintemaarten had een muis] Sint Maarten Liedjes.


Het is duidelijk dat de spaties problemen veroorzaken. Zodra ik de spaties weghaal, gaat de link wel goed. Dus als ik dit doe:
code:
1
[url=http://www.pinkelotje.nl/sintmaarten.html#Sintemaarten_had_een_muis] Sint Maarten Liedjes[/url]
gaat het wel goed. Het is dus de bedoeling dat als er spaties tussen de tekst staat, er wel een link gemaakt wordt.

Dit is de code die ik heb gebruikt.
code:
1
$bericht = eregi_replace("(\\[url=)([A-Za-z0-9_~&=;\?:%@#./\-]+[A-Za-z0-9/])(\])", "<a href=\"\\2\" target=_blank>", $bericht);


Wat moet ik doen om ervoor te zorgen dat mijn spaties worden omgezet zodat de link werkt.


Dit is de hele code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
function UBBCodesVervangen($bericht) { 
    //$bericht = wordwrap($bericht,100); 
    $bericht = htmlspecialchars($bericht); 
    $bericht = nl2br($bericht); 
    $bericht = eregi_replace("([a-zA-Z0-9_-]+)@([a-zA-Z0-9\._-]+)(\.[a-zA-Z]+)", "<a 
 
href=\"mailto:\\1@\\2\\3\">\\1@\\2\\3</a>", $bericht);     $bericht = preg_replace('_\\[php\](.*?)\\[/php\]_ise', "kleur(' \\1 
 
')", $bericht); 
    $bericht = preg_replace('_\\[i\](.*?)\\[/i\]_ise', "italic(' \\1 ')", $bericht); 
    $bericht = preg_replace('_\\[b\](.*?)\\[/b\]_ise', "bold(' \\1 ')", $bericht); 
    $bericht = preg_replace('_\\[u\](.*?)\\[/u\]_ise', "underlined(' \\1 ')", $bericht); 
    $bericht = eregi_replace("\\[url\]www.([^\\[]*)","<a href=\"http://www.\\1\" target=_blank>\\1", $bericht); 
    $bericht = eregi_replace("\\[url\]([^\\[]*)","<a href=\"\\1\" target=_blank>\\1", $bericht);  
 

    $bericht = eregi_replace("(\\[url=)([A-Za-z0-9_~&=;\?:%@#./\-]+[A-Za-z0-9/])(\])", "<a href=\"\\2\" target=_blank>", 
 
$bericht); 
 
    $bericht = eregi_replace("\[url](http://(.*))", "<a href=\"\\1\" target=\"_blank\">\\1", $bericht); 
    $bericht = eregi_replace("(\\[/url\])", "</a>", $bericht); 
 
    $bericht = str_replace("[img]","<img src=\"",$bericht); 
    $bericht = str_replace("[/img]","\">",$bericht); 
    $bericht = str_replace("[img=right]","<img align=right src=\"",$bericht); 
    $bericht = str_replace("[img=left]","<img align=left src=\"",$bericht);
 

    $bericht = str_replace('[center]', '<center>',$bericht);
    $bericht = str_replace('[/center]', '</center>',$bericht);


    $bericht = preg_replace("_\\[code\](.*?)\\[/code\]_ise", "phphighlite_replace('\\1')", $bericht); 
    $bericht = str_replace("http://http://", "http://", $bericht); 
 

    $bericht = str_replace("[quote]", "<p align=center><table width=\"90%\" cellspacing=\"1\" 
 
cellpadding=\"2\"><tr><td><small>Quote:</small></td></tr><td style=\"BORDER-RIGHT: #999999 1px solid; BORDER-TOP: #999999 
 
1px solid; BORDER-BOTTOM: #999999 1px solid; BORDER-LEFT: #999999 1px solid\">", $bericht); 
    $bericht = str_replace("[/quote]", "</td></tr></table></p>", $bericht); 
    $bericht = str_replace(':)', '[img]"smileys/smile.gif"[/img]',$bericht); 
    $bericht = str_replace(':(', '[img]"smileys/boosrood.gif"[/img]',$bericht); 
    $bericht = str_replace(';)', '[img]"smileys/knipoog_dicht.gif"[/img]',$bericht); 
    $bericht = str_replace(':D', '[img]"smileys/happy.gif"[/img]',$bericht); 
    $bericht = str_replace(':d', '[img]"smileys/happy.gif"[/img]',$bericht); 
    $bericht = str_replace(':s', '[img]"smileys/verbaast.gif"[/img]',$bericht); 
    $bericht = str_replace(':S', '[img]"smileys/verbaast.gif"[/img]',$bericht); 
    $bericht = str_replace(':P', '[img]"smileys/tongue.gif"[/img]',$bericht); 
    $bericht = str_replace(':p', '[img]"smileys/tongue.gif"[/img]',$bericht); 
    $bericht = str_replace(":'(",'[img]"smileys/cry.gif"[/img]',$bericht); 
    $bericht = str_replace(':cool:','[img]"smileys/cool.gif"[/img]',$bericht); 
    // Scheld woorde filter 
    $bericht = str_replace("******","******",$bericht); 
    $bericht = str_replace("******","******",$bericht); 
    $bericht = str_replace("******","******",$bericht); 
    $bericht = str_replace("******","******",$bericht); 
    $bericht = str_replace("******","******",$bericht); 
    $bericht = str_replace("******","******",$bericht); 
    $bericht = str_replace("******","******",$bericht); 
    $bericht = str_replace("******","******",$bericht); 
 
    return $bericht; 
    }

Mvgr,

Eddieman

[ Voor 39% gewijzigd door Verwijderd op 11-11-2004 15:46 ]


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Waarom trouwens spaties gebruiken? Volgens mij, mag je tevens geen spaties te gebruiken (en anders is het niet aan te raden ;))

Je kan het eventueel omzetten naar %20's dan zou het moeten blijven werken.

filter ff die scheldwoorden weg

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

offtopic:
SA ---> PW, ik denk dat dat zo wel kan anders pingpongt het wel terug :P Maak ik wle even ubb van de uub in de titel :+ Ook zet ik even PHP in de titel, zoals is uitgelegd in de sticky topics (Afbeeldingslocatie: http://gathering.tweakers.net/global/templates/got/images/icons/Sticky_off.gif) bovenaan P&W. Als ik er naast zit passen ze het daar wel weer voor je aan gok ik. Lees de stickies hoe dan ook even door. Zo kan je daar lezen dat je [ code ] tags kunt gebruiken voor je php zodat het leesbaarder wordt. Welkom op GoT trouwens :Y)

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Verwijderd

Topicstarter
Bij weblog.nl doet die link het wel. Ik moet waarschijnlijk iets aanpassen. Doe ik het zo goed:

$bericht = eregi_replace("(\\[url=)([A-Za-z0-9_~&=;\?:%@#./\-]+[A-Za-z0-9/%20]+[%20])(\])", "<a href=\"\\2\" target=_blank>", $bericht);

Scheldwoorden gefilterd :-)

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Verwijderd schreef op 11 november 2004 @ 14:57:
Bij weblog.nl doet die link het wel. Ik moet waarschijnlijk iets aanpassen. Doe ik het zo goed:

$bericht = eregi_replace("(\\[url=)([A-Za-z0-9_~&=;\?:%@#./\-]+[A-Za-z0-9/%20]+[%20])(\])", "<a href=\"\\2\" target=_blank>", $bericht);

Scheldwoorden gefilterd :-)
Nog even wat anders: zet je code tussen [plain]
code:
1
[/]-tags. Je kan voor php de highlighter gebruiken ala [plain]
PHP:
1
blabla
[/]. Het ziet er dan als volgt uit:

PHP:
1
$bericht = eregi_replace("(\\[url=)([A-Za-z0-9_~&=;\?:%@#./\-]+[A-Za-z0-9/%20]+[%20])(\])", "<a href=\"\\2\" target=_blank>", $bericht);

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Verwijderd

Probeer 't zo 's:

PHP:
1
2
3
<?
$bericht = eregi_replace("(\\[url=)([A-Za-z0-9_~&=;\?:%@#./\- ]+[A-Za-z0-9/])(\])", "<a href=\"\\2\" target=_blank>", $bericht);
?>


Er zat geen spatie in je regex, dus die pakte hij ook niet ;)

offtopic:
BtM909 heeft trouwens wel gelijk, je kan beter www.bla.com/bestand%20met%20spaties gebruiken dan www.bla.com/bestand met spaties

Verwijderd

Ben geen reg exp held, maar volgens de manual zou je met \s ook whitespaces kunnen matchen.

Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Even misschien offtopic, maar biedt een stackparser je misschien niet een betere oplossing voor iets cliche achtig als een ubbcode parser? Je parsed dus UBB code zonder reguliere expressies, maar in plaats daarvan ga je een hele string af (per karakter) zoekend naar tags (zij het open tags danwel sluit tags) die je vervolgens opslaat in een stack, en je vervolgens tag gaat matchen uit deze stack. Heb je een kloppende match gevonden dan pop je 'm uit je stack, en reduceer je je lijst net zo lang tot je niets meer matchend over hebt :). Tijdens het matchen kijk je dan ook of de tags 'geldig' zijn (dus gaat het om een img tag of om een b tag etc..). Ik heb het zelf wel 's geschreven in j# voor asp.net en die was behoorlijk snel, maar 'k weet niet hoe het performed tov reguliere expressies. Maar theoretisch gezien zou het sneller kunnen zijn aangezien je de string maar 1x afgaat en niet per reguliere expressie dus de string telkens af moet gaan om een special case te matchen. Als je geinteresseerd bent in de j# source hoor ik het wel :), ombouwen naar PHP moet niet al te moeilijk zijn.

[ Voor 4% gewijzigd door prototype op 12-11-2004 16:58 . Reden: Uiteraard verzekerd dit ook proper nesting van tags. Ik zie bovendien na een google actie ook dat er al een opensrc variant van een BB code parser (stackbased) bestaat in het PEAR lib (vind je in je PHP distro). ]


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 21-09 12:54
ACM heeft eens een Stackbased ubbparser gemaakt. Volgens mij zijn er nog wel meer in de GoT search te vinden.
Pagina: 1