preg_replace -> functie en variabelen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Raymond ---

Raymond ---

24/10/2007 18:39:00
Quote Anchor link
Ik heb eens stukje van een UBB systeem: (om een link weer te geven)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$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?
 
PHP hulp

PHP hulp

15/07/2024 14:11:00
 
Jelmer -

Jelmer -

24/10/2007 19:01:00
 
Raymond ---

Raymond ---

24/10/2007 21:06:00
Quote Anchor link
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 preg_replace_callback? Want ik snap de voorbeelden van php.net niet echt.

Evt. de functie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
function cut_url($url)
{

    if (strlen($url) > 40){
        $short = substr($url, 0, 18) . "...." . substr($url, -18);
    }
else{
        $short = $url;
    }

        return $short;
}

?>
Gewijzigd op 01/01/1970 01:00:00 door Raymond ---
 
Arend a

Arend a

24/10/2007 22:26:00
Quote Anchor link
Een simpele oplossing is twee regexes.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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;

?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
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;
?>
 
Raymond ---

Raymond ---

25/10/2007 12:33:00
Quote Anchor link
Bedenkt voor je reactie,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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}((\/|~|\#|\?|=|&amp;|&|\+){1}[a-z0-9\-._%]{0,}){0,})#si', '\\1<a href="\\2">\\2</a>',$this->text);

?>

Vervangen door:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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}((\/|~|\#|\?|=|&amp;|&|\+){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}((\/|~|\#|\?|=|&amp;|&|\+){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 ---
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.