[PHP] highlight_string() in eregi_replace()

Pagina: 1
Acties:
  • 100 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • JorisPenders
  • Registratie: April 2004
  • Laatst online: 18:15

JorisPenders

Designer & Coder

Topicstarter
Goeiemorgen mensen :9

Ik zit hier met een probleempje.
Ben bezig met een BB-parser voor mijn website, maar nu stuit ik op het volgende probleem.

Bij code-view dus [ code ] (decode [ / code ] wil ik de code die erin zit via de functie highlight_string() een kleurtje geven :)

Alleen dit lukt dus niet :'(

De volgende code heb ik op dit moment:

code:
1
$text = eregi_replace("\\[code\]([^\\[]*)\\[/code\]", "<b>Code:</b><br /><table bgcolor=\"#000000\" cellspacing=\"1\" width=\"90%\"><tr><td><table cellpadding=2 cellspacing=\"0\" bgcolor=\"#FFFFFF\" width=\"100%\"><tr><td><font face=Courier size=\"1\" color=\"#000000\">" . highlight_string(\\1) . "</font></td></tr></table></td></tr></table>", $text);


Dit wil (misschien wel natuurlijk) niet werken. Mijn vraag is daarom, hoe maak je nou een functie in deze eregi_replace :)?

Dank :)

Joris

SystemSpecs -- WebArea - Your Online Home -- Webdesign


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

Volgens mij kun je dat met preg_replace_callback wel doen, maar dan moet je wel naar een andere regular expression syntax.

Trouwens, als ik het goed zie, dan sta je nu geen [-tekens toe in de code-blokken. Lijkt me wel lastig voor mensen die code willen laten zien waarin met array's gewerkt word.

Acties:
  • 0 Henk 'm!

  • dip
  • Registratie: September 2003
  • Laatst online: 16-01-2023

dip

shut up ulé

This will do that trick:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function parse_php($data)
{
   $data = str_replace("]\n", "]", $data);
   $match = array('#\\[code\](.*?)\\[\/code\]#se');
   $replace = array("'<pre>'.highlight_string(stripslashes('$1'), true).'</pre>'");
   return preg_replace($match, $replace, $data);
}

$input = '[code]<? echo $bla;?>[/code]<BR>plain text<BR>[code]<? echo $bla;?>[/code]';

echo parse_php($input);
?>

It's scientifically known, that base improves the tase of cheezes!


Acties:
  • 0 Henk 'm!

  • JorisPenders
  • Registratie: April 2004
  • Laatst online: 18:15

JorisPenders

Designer & Coder

Topicstarter
Dank je dip :), het werkt!!

Nu het volgende probleem :(

Heb nu het volgende probleem:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// HTML uit bericht filteren
if ($allowhtml!= "1")
{ $text=htmlspecialchars($text); }
// Enters toevoegen
$text = nl2br($text);
// Slashes strippen
$text = stripslashes($text);
// Wordwrap
$text = wordwrap($text, 60, "\n", true);
// Code
$text = parse_php($text);
?>
en hieronder het hele gebeuren van Smiles, dikgedrukt etc...


Nu haalt ie de code gewoon door de hele parser heen. Dit mag niet, omdat er allemaal smilies ingezet worden, er worden 2x enters toegevoegd (nl2br en highlight_string) etc.

Hoe kan ik nou de code niet door de parser heenhalen en de rest van de tekst wel?

[ Voor 6% gewijzigd door JorisPenders op 04-11-2005 13:38 ]

SystemSpecs -- WebArea - Your Online Home -- Webdesign


Acties:
  • 0 Henk 'm!

  • dip
  • Registratie: September 2003
  • Laatst online: 16-01-2023

dip

shut up ulé

Kheb m nog even iets cooler gemaakt :)

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
<?php

function parse_php($data)
{
   $data = str_replace("]\n", "]", $data);
   $match = array('#\\[code\](.*?)\\[\/code\]#se');
   $replace = array("parse_highlight(stripslashes('$1'))");
   return preg_replace($match, $replace, $data);
}

function parse_highlight($data)
{
    $parsed = highlight_string($data,true);
    // $parsed;
    $exploded = explode("<br />",$parsed);
    sizeof($exploded);
    
    $counter = "";
    for ($i = 1; $i <= sizeof($exploded); $i++)
    {
        $counter .= "$i<BR>";//
    }   
    return '<div class="code_block">
                <div class="row_count">'.$counter.'</div>
                <div class="code_content">'.$parsed.'</div>
            </div>';
}

$input = '[code]<?
function parse_highlight($data)
{
    $parsed = highlight_string($data,true);
    return $parsed;
//  $exploded = explode($parsed
    $replace = array("parse_highlight(stripslashes(\'$1\'))");  $replace = array("parse_highlight(stripslashes(\'$1\'))");
}
?>[/code]<BR>plain text<BR>[code]<? echo $bla;?>[/code]';

echo parse_php($input);

?>

<style>
div {
    position: relative;
    overflow: hidden;
    padding:0px;
    margin:0px; 
}

.code_block {
    width:470px;
    border: 1px #031360 solid;  
    margin: 2px 0;
    table-layout: fixed;
    border-collapse: collapse;
}

.row_count {
    float:left;
    background-color:#CCCCCC;
    border-right:1px #031360 solid; 
    width:19px;
    text-align: right;
    font-family:"Courier New", Courier, mono;
    font-size:9pt;
}

.code_content {
    float:left;
    font-family:"Courier New", Courier, mono;
    font-size:9pt;  
    overflow: auto;
    width:450px;
    white-space: nowrap;        
}

</style>

It's scientifically known, that base improves the tase of cheezes!


Acties:
  • 0 Henk 'm!

  • dip
  • Registratie: September 2003
  • Laatst online: 16-01-2023

dip

shut up ulé

Je zou kunnen achterhalen of je met je huidige positie (waar bijvoorbeeld een smilie zit of zou kunnen zitten) in een [code] tag zit. Beter is zoals je zelf al aangeeft, de [code] tags uit te sluiten van je smilie parser.

Ik kan zo 123 hier geen correcte oplossing voor vinden.
Wat je zou kunnen proberen is de strpos van de [code] en [\code] tags op te slaan, en alles ervoor en erachter wel te parsen met je smilieparser. Natuurlijk moet je bij meerdere [code] tags meerdere malen kijken.

It's scientifically known, that base improves the tase of cheezes!

Pagina: 1