Replacen zonder vervangen text opnieuw te replacen
ik heb een tekst die ik wil replacen in javascript (of zou ook in PHP kunnen).
Die tekst bevat onder andere de tekens + - < > / en keywords zoals class, function, continue
Ik wil die dingen omringen met <span class="operator"> of <span class="
keyword"> tags. Dus vervangen door er span tags omheen te zetten.
Wat dus elke keer mis gaat, is dat de < en > / en andere html tekens in de span tags weer worden vervangen. Ook wil ik later nog tekst tussen aanhalingstekens vervangen, wat weer een probleem zal worden.
Dus als iets in de string is vervangen en er zijn span tags omheen gezet, dan worden daarna bij de eerstvolgende match weer de < en > tekens van de <span> tags vervangen. Dan krijg je ongeveer iets als dit:
<span class="operator><span class="operator">></</span>span><</span>span class="operator><</span>
Iemand die me kan helpen?
Zoek dan eens op syntax highlighter en dan kom je bijvoorbeeld dit tegen:
http://alexgorbatchev.com/SyntaxHighlighter/
Gewijzigd op 12/04/2014 15:51:30 door Frank Nietbelangrijk
Ja, maar nu weet ik nog niet hoe je dit oplost?
ik heb een demo gemaakt die gebruik maakt van explode(). Denk niet dat dit goed genoeg is om te gebruiken.
Er zijn nog vele gevallen waarin dit niet gaat werken. Maar het geeft een beetje aan hoe zoiets werkt.
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
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
67
68
69
70
71
72
73
74
75
76
77
78
79
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
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
$t = "class test { public function render() { echo 'dit is een class'; } } echo 'test';";
// keywords gerangschikt op css classnamen
$colors = array(
'green' => array('class', 'echo', 'function'),
'blue' => array('public'),
);
// als eerste explode op '. oneven elementen in de array zijn dan geen tekstblok en even elementen zijn wel een tekstblok
$arr = explode("'", $t);
// ga alleen de even elementen exploden op een spatie
for($i = 0 ; $i < count($arr) ; $i += 2)
{
$arr[$i] = explode(' ', $arr[$i]);
}
// laat zien tot hoever we nu een array hebben opgebouwd
echo '<pre>';
print_r($arr);
echo '</pre>';
// nu gaan we onze elementen uit de array weer aan elkaar plakken maar we zetten er <span>'s omheen waar we dat willen
$result = '';
foreach($arr as $key => $part)
{
// als het een even element is
if($key % 2 == 0)
{
foreach($part as $token)
{
$spanopen = '';
$spansluit = '';
// kleur voor kleur uit de array $colors
foreach($colors as $key => $color)
{
// kijk of deze kleur een keyword heeft dat met ons token voorkomt
if(in_array($token, $color))
{
$spanopen = '<span class="' . $key . '">';
$spansluit = '</span>';
break;
}
}
$result .= $spanopen . $token . $spansluit . ' ';
}
}
// als het een oneven element is dan was het een blok tekst. geef deze in het rood weer.
else
{
$result .= '<span class="red">' . "'" . $part . "'</span> ";
}
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
<style>
.red {
color:red;
}
.green {
color:green;
font-weight:bold;
}
.blue {
color:blue;
}
</style>
</head>
<body>
<?php echo $result; ?>
</body>
</html>
$t = "class test { public function render() { echo 'dit is een class'; } } echo 'test';";
// keywords gerangschikt op css classnamen
$colors = array(
'green' => array('class', 'echo', 'function'),
'blue' => array('public'),
);
// als eerste explode op '. oneven elementen in de array zijn dan geen tekstblok en even elementen zijn wel een tekstblok
$arr = explode("'", $t);
// ga alleen de even elementen exploden op een spatie
for($i = 0 ; $i < count($arr) ; $i += 2)
{
$arr[$i] = explode(' ', $arr[$i]);
}
// laat zien tot hoever we nu een array hebben opgebouwd
echo '<pre>';
print_r($arr);
echo '</pre>';
// nu gaan we onze elementen uit de array weer aan elkaar plakken maar we zetten er <span>'s omheen waar we dat willen
$result = '';
foreach($arr as $key => $part)
{
// als het een even element is
if($key % 2 == 0)
{
foreach($part as $token)
{
$spanopen = '';
$spansluit = '';
// kleur voor kleur uit de array $colors
foreach($colors as $key => $color)
{
// kijk of deze kleur een keyword heeft dat met ons token voorkomt
if(in_array($token, $color))
{
$spanopen = '<span class="' . $key . '">';
$spansluit = '</span>';
break;
}
}
$result .= $spanopen . $token . $spansluit . ' ';
}
}
// als het een oneven element is dan was het een blok tekst. geef deze in het rood weer.
else
{
$result .= '<span class="red">' . "'" . $part . "'</span> ";
}
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
<style>
.red {
color:red;
}
.green {
color:green;
font-weight:bold;
}
.blue {
color:blue;
}
</style>
</head>
<body>
<?php echo $result; ?>
</body>
</html>