List met BBcode schrijven
Ik ben bezig met een soort BBcode aan het schrijven. Nu wil ik zorgen dat iemand die in BBcode schrijft, dit kan opschrijven:
Code (php)
1
2
3
4
2
3
4
Hans, hier het boodschappenlijstje:
* 2,5 kg aardappels
* 2 pakken melk
* 500 g rundergehakt
* 2,5 kg aardappels
* 2 pakken melk
* 500 g rundergehakt
om dit te bereiken:
Hans, hier het boodschappenlijstje:
- 2,5 kg aardappels
- 2 pakken melk
- 500 g rundergehakt
Hoe kan ik dat bereiken? Ik heb al een beetje zitten prutsen met reguliere expressies, waarin men zoekt naar een begin van een regel en dan een asterisk, maar je weet natuurlijk niet hoeveel lijst-items er zijn...
Gewijzigd op 18/01/2011 21:52:24 door Maurits de Jong
preg_replace_callback();
Je kunt als pattern dan deze gebruiken '#((^|\n)( |\t)*\*(.*?)){2,}\n#', waarbij je er zeker van moet zijn dat de enters in de string ook echt als \n zijn, en niet als \r\n of iets anders.
Zowel lines 2-4 wordt gepakt door de pattern. Maar ook lines 7-8 wordt gepakt. De rest niet!
Bij de preg_replace_callback kun je dan een functie aanroepen, die de volledige string krijgt. Hier kun je dan de aterisk (*) exploden uit die string en heb je een array met alle list-items.
Leuk! Dit heb ik laatst nog gemaakt. Ik heb het zelf gedaan met een Je kunt als pattern dan deze gebruiken '#((^|\n)( |\t)*\*(.*?)){2,}\n#', waarbij je er zeker van moet zijn dat de enters in de string ook echt als \n zijn, en niet als \r\n of iets anders.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
Hans, hier het boodschappenlijstje:
* 2,5 kg aardappels
* 2 pakken melk
* 500 g rundergehakt
Maar vergeet ook niet:
* 3 ons worst
* vijf kilo mais
Trouwens, ik gebruik hier een aterisk: *, maar er gebeurt niets.
Ook nu niet:
* Bij gebruik van maar n aterisk maak je uiteraard ook geen opsomming.
* 2,5 kg aardappels
* 2 pakken melk
* 500 g rundergehakt
Maar vergeet ook niet:
* 3 ons worst
* vijf kilo mais
Trouwens, ik gebruik hier een aterisk: *, maar er gebeurt niets.
Ook nu niet:
* Bij gebruik van maar n aterisk maak je uiteraard ook geen opsomming.
Zowel lines 2-4 wordt gepakt door de pattern. Maar ook lines 7-8 wordt gepakt. De rest niet!
Bij de preg_replace_callback kun je dan een functie aanroepen, die de volledige string krijgt. Hier kun je dan de aterisk (*) exploden uit die string en heb je een array met alle list-items.
Mark L op 18/01/2011 22:59:21:
Leuk! Dit heb ik laatst nog gemaakt.
Wat grappig!
Thanks! Ik ga er direct mee aan de slag!
Dit is precies wat ik nodig heb! Zou iemand deze functie met ons willen delen?
Ik heb het niet getest, maar dit zou moeten werken.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$string = "Hans, hier het boodschappenlijstje:\n
* 2,5 kg aardappels\n
* 2 pakken melk\n
* 500 g rundergehakt\n";
$uitkomst = preg_replace_callback('#((^|\n)( |\t)*\*(.*?)){2,}\n#', 'make_list_items', $string);
function make_list_items($string = null) {
if($string !== null) {
return preg_replace('#((^|\n)( |\t)*\*(.*?)){2,}\n#', '<li>$1</li>', $string);
}
}
?>
$string = "Hans, hier het boodschappenlijstje:\n
* 2,5 kg aardappels\n
* 2 pakken melk\n
* 500 g rundergehakt\n";
$uitkomst = preg_replace_callback('#((^|\n)( |\t)*\*(.*?)){2,}\n#', 'make_list_items', $string);
function make_list_items($string = null) {
if($string !== null) {
return preg_replace('#((^|\n)( |\t)*\*(.*?)){2,}\n#', '<li>$1</li>', $string);
}
}
?>
Gewijzigd op 15/05/2012 17:40:42 door Victor -
http://www.pfz.nl/archief/943778-ubb-met-automatische-list-herkenning/
Code (php)
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
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
<?php
function generate_lists($text)
{
$lists = array();
preg_match_all("#(\n|\r)(\s{0,}-(.*))+#", $text, $lists, PREG_PATTERN_ORDER);
if(count($lists) > 0)
{
unset($lists[1]); // not neccesary here
foreach($lists[0] as $list)
{
$items = array();
$listcode = "\n<ul>\n";
preg_match_all("#^\s{0,}-[\s]{0,}(.*)(\n|\r)?$#m", $list, $items, PREG_PATTERN_ORDER);
unset($items[0]);
foreach($items[1] as $item)
{
$listcode .= " <li>" . $item . "</li>\n";
}
$listcode .= "</ul>";
$text = str_replace($list, $listcode, $text);
}
}
return $text;
}
$forum_post = "
Test.<br />
Nog een test<br />
- Bladiebladiebla
- Boedieboedieboe
Okee dan!<br />
- Bladiebladiebla
Er zijn vele ex-php'ers in de wereld.<br />
Boe";
echo generate_lists($forum_post);
?>
function generate_lists($text)
{
$lists = array();
preg_match_all("#(\n|\r)(\s{0,}-(.*))+#", $text, $lists, PREG_PATTERN_ORDER);
if(count($lists) > 0)
{
unset($lists[1]); // not neccesary here
foreach($lists[0] as $list)
{
$items = array();
$listcode = "\n<ul>\n";
preg_match_all("#^\s{0,}-[\s]{0,}(.*)(\n|\r)?$#m", $list, $items, PREG_PATTERN_ORDER);
unset($items[0]);
foreach($items[1] as $item)
{
$listcode .= " <li>" . $item . "</li>\n";
}
$listcode .= "</ul>";
$text = str_replace($list, $listcode, $text);
}
}
return $text;
}
$forum_post = "
Test.<br />
Nog een test<br />
- Bladiebladiebla
- Boedieboedieboe
Okee dan!<br />
- Bladiebladiebla
Er zijn vele ex-php'ers in de wereld.<br />
Boe";
echo generate_lists($forum_post);
?>