preg_replace -> functie en variabelen
Code (php)
1
2
3
2
3
<?php
$string = preg_replace('#\[url\](.+?)\[/url\]#si','<a href="http://\\1">\\1</a>',$string);
?>
$string = preg_replace('#\[url\](.+?)\[/url\]#si','<a href="http://\\1">\\1</a>',$string);
?>
Nu wou ik daar een functie aan toevoegen die de link inkort als die te lang is.
Ik probeerde het zo (dacht al dat het niet werkte, toch nog even getest):
Code (php)
1
2
3
2
3
<?php
$string = preg_replace('#\[url\](.+?)\[/url\]#si','<a href="http://\\1">'.cut_url("\\1").'</a>',$string);
?>
$string = preg_replace('#\[url\](.+?)\[/url\]#si','<a href="http://\\1">'.cut_url("\\1").'</a>',$string);
?>
Dat werkt niet, toen heb ik nog wat lopen prutsen met quotes (quotes weghalen, bijzetten, verplaatsen enz.). Ook hbe ik de \\1 vervangen door $1.
Maar elke keer gebeurd er hetzelfde, namelijk:
In de functie word de lengte van de url opgevraagd (strlen). Maar hij neemt dan de lengte van wat er tussen de quotes staat (\\1), dat komt altijd uit op 2 karakters. Logisch want het staat tussen quotes. Maar zodra ik de quotes weghaal, krijg ik een warning:
Warning: Unexpected character in input: '\' (ASCII=92) state=1 in C:\wamp\www\project_cms\classes_functions\class.ubb.php on line 158
Is er een mogelijkheid om de uitkomst uit de preg_replace toch door een functie te halen?
preg_replace_callback? Want ik snap de voorbeelden van php.net niet echt.
Evt. de functie:
Ik heb het doorgelezen, en ik begrijp een deel, maar nu snap ik eigenlijk niet wat ik moet doen... Zou je een klein voorbeeldje willen geven over het gebruik van Evt. de functie:
Code (php)
Gewijzigd op 01/01/1970 01:00:00 door Raymond ---
Een die korte urls matched, en een die lange matched.
http://lalalalal.blogspot.org/test/nogwat/nogeenurl/nogwat/en_nog_veel_meer/test
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?
$text = "[url]http://www.korteurl.org[/url]\n[url]http://www.zeer.lange.url/met/heel/veel/tekens?en&nog=andere/elementen[/url]";
$text = preg_replace("/\[url\](.{0,40}?)\[\/url\]/i",'<a href="\\1" target="_blank">\\1</a>', $text);
$text = preg_replace("/\[url\](.{0,20}?(:?.+?)(.{0,20}?))\[\/url\]/i",'<a href="\\1" target="_blank">\\2..\\3</a>', $text);
print $text;
?>
$text = "[url]http://www.korteurl.org[/url]\n[url]http://www.zeer.lange.url/met/heel/veel/tekens?en&nog=andere/elementen[/url]";
$text = preg_replace("/\[url\](.{0,40}?)\[\/url\]/i",'<a href="\\1" target="_blank">\\1</a>', $text);
$text = preg_replace("/\[url\](.{0,20}?(:?.+?)(.{0,20}?))\[\/url\]/i",'<a href="\\1" target="_blank">\\2..\\3</a>', $text);
print $text;
?>
En een overzichtelijkere manier om een grote rits aan ubb tags te doen is door eerst alle regels in een hash te zetten en die daarna door regex te houden.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?
$text = "[url]http://www.korteurl.org[/url]\n[url]http://www.zeer.lange.url/met/heel/veel/tekens?en&nog=andere/elementen[/url][b]bold[/b][u]strong[/u]";
$ubbRules = array(
// [url] van veertig tekens[/url] naar links
"/\[url\](.{0,40}?)\[\/url\]/i" => '<a href="\\1" target="_blank">\\1</a>',
// [url]Langer dan 40 tekens [/url] naar link..eind
"/\[url\](.{0,20}?(:?.+?)(.{0,20}?))\[\/url\]/i" => '<a href="\\1" target="_blank">\\2..\\3</a>',
// [b]bold[b] naar <strong>bold</strong>
"/\[b\](.*?)\[\/b\]/i" => '<strong>\\1</strong>',
// [u]underline[/u] naar <span style="text-decoration: underline">underline</span>
"/\[u](.*?)\[\/u\]/i" => '<span style="text-decoration: underline">\\1</span>'
);
$text = preg_replace(array_keys($ubbRules),array_values($ubbRules), $text);
print $text;
?>
$text = "[url]http://www.korteurl.org[/url]\n[url]http://www.zeer.lange.url/met/heel/veel/tekens?en&nog=andere/elementen[/url][b]bold[/b][u]strong[/u]";
$ubbRules = array(
// [url] van veertig tekens[/url] naar links
"/\[url\](.{0,40}?)\[\/url\]/i" => '<a href="\\1" target="_blank">\\1</a>',
// [url]Langer dan 40 tekens [/url] naar link..eind
"/\[url\](.{0,20}?(:?.+?)(.{0,20}?))\[\/url\]/i" => '<a href="\\1" target="_blank">\\2..\\3</a>',
// [b]bold[b] naar <strong>bold</strong>
"/\[b\](.*?)\[\/b\]/i" => '<strong>\\1</strong>',
// [u]underline[/u] naar <span style="text-decoration: underline">underline</span>
"/\[u](.*?)\[\/u\]/i" => '<span style="text-decoration: underline">\\1</span>'
);
$text = preg_replace(array_keys($ubbRules),array_values($ubbRules), $text);
print $text;
?>
Ik ben niet zo goed in preg_replace en regex (de code die ik tot nu toe heb laten zien komen ook gewoon uit Hipska's UBB Class). Ik kom er niet uit.
Ik heb dit regeltje:
Code (php)
1
2
3
4
2
3
4
<?php
$this->text = preg_replace('#(^|[ \n\r\t])([a-z0-9]{1,6}://([a-z0-9\-]{1,}(\.?)){1,}[a-z]{2,5}(:[0-9]{2,5}){0,1}((\/|~|\#|\?|=|&|&|\+){1}[a-z0-9\-._%]{0,}){0,})#si', '\\1<a href="\\2">\\2</a>',$this->text);
?>
$this->text = preg_replace('#(^|[ \n\r\t])([a-z0-9]{1,6}://([a-z0-9\-]{1,}(\.?)){1,}[a-z]{2,5}(:[0-9]{2,5}){0,1}((\/|~|\#|\?|=|&|&|\+){1}[a-z0-9\-._%]{0,}){0,})#si', '\\1<a href="\\2">\\2</a>',$this->text);
?>
Vervangen door:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$this->text = preg_replace('#(^|[ \n\r\t])([a-z0-9]{1,6}://([a-z0-9\-]{1,}(.{0,40}?)){1,}[a-z]{2,5}(:[0-9]{2,5}){0,1}((\/|~|\#|\?|=|&|&|\+){1}[a-z0-9\-._%]{0,}){0,})#si', '\\1<a href="\\2">\\2</a>',$this->text);
$this->text = preg_replace('#(^|[ \n\r\t])([a-z0-9]{1,6}://([a-z0-9\-]{1,}(.{0,20}?(:?.+?)(.{0,20}?)){1,}[a-z]{2,5}(:[0-9]{2,5}){0,1}((\/|~|\#|\?|=|&|&|\+){1}[a-z0-9\-._%]{0,}){0,})#si','\\1<a href="\\2">\\3..\\4</a>',$this->text);
?>
$this->text = preg_replace('#(^|[ \n\r\t])([a-z0-9]{1,6}://([a-z0-9\-]{1,}(.{0,40}?)){1,}[a-z]{2,5}(:[0-9]{2,5}){0,1}((\/|~|\#|\?|=|&|&|\+){1}[a-z0-9\-._%]{0,}){0,})#si', '\\1<a href="\\2">\\2</a>',$this->text);
$this->text = preg_replace('#(^|[ \n\r\t])([a-z0-9]{1,6}://([a-z0-9\-]{1,}(.{0,20}?(:?.+?)(.{0,20}?)){1,}[a-z]{2,5}(:[0-9]{2,5}){0,1}((\/|~|\#|\?|=|&|&|\+){1}[a-z0-9\-._%]{0,}){0,})#si','\\1<a href="\\2">\\3..\\4</a>',$this->text);
?>
Maar het lukt me gewoon niet, ik denk dat dat vooral komt omdat ik het niet goed snap. Ik werd niet echt veel wijzer van de php.net handleiding. Ik hoef geen hele voorgekauwde code, maar misschien is er iemand die voor mij de regex kan ontleden? Zodat ik snap wat alles doet.
Gewijzigd op 01/01/1970 01:00:00 door Raymond ---