Ik heb een scriptje op een site die het mogelijk zou moeten maken om zowel simpele UBB-codes te parsen als links in tekst om te zetten naar klikbare links.
Dus er is een stuk tekst met bijvoorbeeld zo'n UBB-code:
of zo-een:
en verder kunnen er ook nog gewone adressen in de tekst staan: www.davdigital.com.
De bedoeling is dat dit allemaal goed werkt.
Ik heb nu de volgende stukken code:
Simpele UBB:
Maak link:
Het is nu zo dat het UBB-filter eerst wordt losgelaten op een tekst en daarna het 'maak link' filter. Resultaat is dat de link die vanuit de UBB werd gemaakt nog een keer vervangen wordt en er niks meer van klopt. Als een link al in HTML-vorm staat, dan moet er niet nog een keer een link van worden gemaakt.
Ik heb dat geprobeerd met dit stukje regular expression:
Wellicht is het handiger om het proces om te draaien: eerst links mooi maken en dan pas filteren op UBB-codes. Dan zou het goed moeten gaan. Probleempje is dat heel m'n code (al behoorlijk wat) nu uitgaat van de eerder genoemde volgorde. Is dit nog te fixen of moet ik de rest van m'n code maar gaan verbouwen?
Dus er is een stuk tekst met bijvoorbeeld zo'n UBB-code:
code:
1
| [url=www.davdigital.com]davdigital[/url] |
of zo-een:
code:
1
| [url=http://www.davdigital.com]davdigital[/url] |
en verder kunnen er ook nog gewone adressen in de tekst staan: www.davdigital.com.
De bedoeling is dat dit allemaal goed werkt.
Ik heb nu de volgende stukken code:
Simpele UBB:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| $srch = array( "'\\[b\](.*?)\\[\/b\]'i", "'\\[list\]'i", "'\\[\/list\]'i", "'\\[li\]'i", "'\\[\/li\]'i", "'\[url=http://(.*?)\](.*?)\\[\/url\]'is", // external absolute url "'\[url=(.*?)\](.*?)\\[\/url\]'i" // internal relative url ); $rplc = array( "<b>$1</b>", "<ul>", "</ul>", "<li>", "<br /></li>", "<a class='text' target='_blank' href='http://$1'>$2</a>", "<a class='text' href='$1'>$2</a>" ); $txt = preg_replace($srch, $rplc, $txt); |
Maak link:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
| // Filter replace structures $srch = array( "/[^href]\"?([\w-?&;#~=\.\/]+\@(\\[?)[a-z0-9\-\.]+\.([a-z]{2,6}|[0-9]{1,3})(\]?))\"?/is", "/[^'](((http:\/\/)|(www\.))([\w\.]+)([,:%#&\/?=\w+\.-]+))(?:\b|$)/is" ); $rplc = array( " <a class=\"text\" href=\"mailto:$1\">$1</a>", " <a class=\"text\" href=\"http://$1\" target=\"_blank\">$1</a>" ); $txt = preg_replace($srch, $rplc, $txt); |
Het is nu zo dat het UBB-filter eerst wordt losgelaten op een tekst en daarna het 'maak link' filter. Resultaat is dat de link die vanuit de UBB werd gemaakt nog een keer vervangen wordt en er niks meer van klopt. Als een link al in HTML-vorm staat, dan moet er niet nog een keer een link van worden gemaakt.
Ik heb dat geprobeerd met dit stukje regular expression:
code:
die er voor zou moeten zorgen dat een URL niet met een quote mag beginnen. Dit haalt helaas niet veel uit.1
| [^'] |
Wellicht is het handiger om het proces om te draaien: eerst links mooi maken en dan pas filteren op UBB-codes. Dan zou het goed moeten gaan. Probleempje is dat heel m'n code (al behoorlijk wat) nu uitgaat van de eerder genoemde volgorde. Is dit nog te fixen of moet ik de rest van m'n code maar gaan verbouwen?
[ specs ] [ Tweaker gallery ]