art-d-sign
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 16.03.2005, 11:34   #1
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User

Highlighter


ich habe einen kleinen SQL-Highlighter geschrieben. Dieser bedient sich eines Arrays, in dem die SQL-Schlüsselwörter stehen.
Das klappt auch ganz gut, nur ersetzt er auch Wortteile, und das ist nicht korrekt. Einfach Spaces einzufügen funktioniert bei meiner Methode nicht, dann müsste ich alles umschreiben.
Hat jemand einen Geistesblitz ?

PHP-Code:
global $sql_keywords;
$tmp="/".implode("/ /",$sql_keywords)."/";
$tmp_array=explode(" ",$tmp);
$tmp="<span style=\"color:#990099;font-weight:bold;\">".implode("</span>###<span style=\"color:#990099;font-weight:bold;\">",$sql_keywords)."</span>";
$tmp_replace=explode("###",$tmp);

$sql=nl2br(htmlentities($sql));
$sql=preg_replace("/`(.*?)`/si""<span style=\"color:red;\">`$1`</span>"$sql);
str_replace("{","{<ul>",$sql);
str_replace("}","}</ul>",$sql);
str_replace("*","<span style=\"color:red;\">*</span>",$sql);
$sql=preg_replace($tmp_array$tmp_replace$sql); 
wer testen will, hier das Array:
PHP-Code:
$sql_keywords=array(  'ALTER''AND''ADD''AUTO_INCREMENT','BETWEEN''BINARY''BOTH''BY''BOOLEAN','CHANGE''CHARSET','CHECK','COLLATE''COLUMNS''COLUMN''CROSS','CREATE',    'DATABASES''DATABASE''DATA''DELAYED''DESCRIBE''DESC',  'DISTINCT''DELETE''DROP''DEFAULT','ENCLOSED''ENGINE','ESCAPED''EXISTS''EXPLAIN','FIELDS''FIELD''FLUSH''FOR''FOREIGN''FUNCTION''FROM','GROUP''GRANT','HAVING','IGNORE''INDEX''INFILE''INSERT''INNER''INTO''IDENTIFIED','JOIN','KEYS''KILL','KEY','LEADING''LIKE''LIMIT''LINES''LOAD''LOCAL''LOCK''LOW_PRIORITY''LEFT''LANGUAGE''MEDIUMINT''MODIFY','MyISAM','NATURAL''NOT''NULL''NEXTVAL','OPTIMIZE''OPTION''OPTIONALLY''ORDER''OUTFILE''OR''OUTER''ON','PROCEEDURE','PROCEDURAL''PRIMARY','READ''REFERENCES''REGEXP''RENAME''REPLACE''RETURN''REVOKE''RLIKE''RIGHT','SHOW''SONAME''STATUS''STRAIGHT_JOIN''SELECT''SETVAL''TABLES''TEMINATED''TO''TRAILING','TRUNCATE''TABLE''TEMPORARY''TRIGGER''TRUSTED','UNIQUE''UNLOCK''USE''USING''UPDATE''UNSIGNED','VALUES''VARIABLES''VIEW','WITH''WRITE''WHERE','ZEROFILL','XOR','ALL''ASC''AS','SET','IN''IS''IF'); 
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten


Alt 16.03.2005, 15:45   #2
Guest
 
Registriert seit: Aug 2002
Strogij hilft, wo's gehtStrogij hilft, wo's geht
Also ein Parser ist immer etwas komplex, weil da einige Ausnahmen sind wie z.B. Kommentare und Strings, die umschlossen sind mit "" (da sollen ja auch keine Schlüsselwörter farbig dargestellt werden). Bei meinem C++ Parser habe ich ganz auf Regex verzichtet und habe eine eigene Methode entwickelt, mit der es auch schneller als mit Regex geht. Das braucht natürlich mehr Zeit und Feinarbeit, die man in PHP sonst nicht oft hat, man kann aber auch was Fertiges nehmen, gibt ja genug im Netz.
Aber zu deiner Frage: Eine eigene implode-Funktion, die dir die Spaces macht vielleicht? Bräuchtest dann wenig umschreiben.
Strogij ist offline   Mit Zitat antworten
Alt 16.03.2005, 22:25   #3
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
ich befürchte, Du hast recht und ich muss alles umschreiben.
Da könnte ich einen kleinen Tipp gebrauchen.

Ich muss das SQL-Statement in die einzelnen Worte aufsplitten. Ein explode mit spaces reicht dazu nicht, kann ein Wort ja auch von "`',;+- etc umschlossen sein.
Wie kann ich ein explode mit einem Array von Zeichen erreichen ? Gibt es da überhaupt eine Funktion ?
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 16.03.2005, 22:41   #4
TP-Moderator
 
Benutzerbild von Stuck Mojo
 
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
Stuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKE
Ich schmeisse einfach mal das Wort Tokenizer in den Raum

Gruss
Jan
Stuck Mojo ist offline   Mit Zitat antworten
Alt 16.03.2005, 22:46   #5
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
Jan - das soll aber nicht nur bei mir laufen.
Wenn ich das richtig überflogen habe, ist das erst in zend2 eingebaut, und als extension ist mir das noch nicht über den Weg gelaufen ...
Ich such schon nach einer Lösung mit "normalen" Bordmitteln

EDIT ich nehm alles zurück - ist ja ab PHP 4.3.0

werd mich sofort damit beschäftigen
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer

Geändert von steffenk (16.03.2005 um 23:01 Uhr).
steffenk ist offline   Mit Zitat antworten
Alt 17.03.2005, 09:10   #6
TP-Moderator
 
Benutzerbild von Stuck Mojo
 
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
Stuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKE
mmhh... naja, ich meine eigentlich eher einen eigenen Tokenizer... Die Tokenizerfunktionen aus PHP können doch nur mit php-code umgehen, oder?

Gruss
Jan
Stuck Mojo ist offline   Mit Zitat antworten
Alt 17.03.2005, 09:33   #7
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
ich habe den Anfang schon gemacht - der zerlegt das tatsächlich.
Aus
PHP-Code:
$test="CREATE TABLE `phpbb_posts` (
  `post_id` mediumint(8) unsigned NOT NULL auto_increment,
  `topic_id` mediumint(8) unsigned NOT NULL default '0',
  `forum_id` smallint(5) unsigned NOT NULL default '0',
  `poster_id` mediumint(8) NOT NULL default '0',
  `post_time` int(11) NOT NULL default '0',
  `poster_ip` varchar(8) NOT NULL default '',
  `post_username` varchar(25) default NULL,
  `enable_bbcode` tinyint(1) NOT NULL default '1',
  `enable_html` tinyint(1) NOT NULL default '0',
  `enable_smilies` tinyint(1) NOT NULL default '1',
  `enable_sig` tinyint(1) NOT NULL default '1',
  `post_edit_time` int(11) default NULL,
  `post_edit_count` smallint(5) unsigned NOT NULL default '0',
  `post_edit_user` mediumint(8) default NULL,
  `reporter_id` mediumint(8) NOT NULL default '0',
  `user_avatar` varchar(100) default NULL,
  `user_avatar_type` tinyint(4) NOT NULL default '0',
  `rating_rank_id` smallint(5) unsigned NOT NULL default '0',
  `post_icon` tinyint(2) unsigned NOT NULL default '0',
  `post_edit_percent` smallint(3) NOT NULL default '0',
  `post_attachment` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`post_id`),
  KEY `forum_id` (`forum_id`),
  KEY `topic_id` (`topic_id`),
  KEY `poster_id` (`poster_id`),
  KEY `post_time` (`post_time`),
  KEY `posts_ratingrankid` (`rating_rank_id`),
  KEY `reporter_id` (`reporter_id`)
) TYPE=MyISAM;"

macht er dann:
PHP-Code:
Array
(
    [
0] => Array
        (
            [
0] => 304
            
[1] => CREATE
        
)

    [
1] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
2] => Array
        (
            [
0] => 304
            
[1] => TABLE
        
)

    [
3] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
4] => `
    [5] => Array
        (
            [0] => 304
            [1] => phpbb_posts
        )

    [6] => 
`
    [
7] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
8] => (
    [
9] => Array
        (
            [
0] => 356
            
[1] => 
  
        )

    [
10] => `
    [11] => Array
        (
            [0] => 304
            [1] => post_id
        )

    [12] => 
`
    [
13] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
14] => Array
        (
            [
0] => 304
            
[1] => mediumint
        
)

    [
15] => (
    [
16] => Array
        (
            [
0] => 302
            
[1] => 8
        
)

    [
17] => )
    [
18] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
19] => Array
        (
            [
0] => 304
            
[1] => unsigned
        
)

    [
20] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
21] => Array
        (
            [
0] => 304
            
[1] => NOT
        
)

    [
22] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
23] => Array
        (
            [
0] => 304
            
[1] => NULL
        
)

    [
24] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
25] => Array
        (
            [
0] => 304
            
[1] => auto_increment
        
)

    [
26] => ,
    [
27] => Array
        (
            [
0] => 356
            
[1] => 
  
        )

    [
28] => `
    [29] => Array
        (
            [0] => 304
            [1] => topic_id
        )

    [30] => 
`
    [
31] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
32] => Array
        (
            [
0] => 304
            
[1] => mediumint
        
)

    [
33] => (
    [
34] => Array
        (
            [
0] => 302
            
[1] => 8
        
)

    [
35] => )
    [
36] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
37] => Array
        (
            [
0] => 304
            
[1] => unsigned
        
)

    [
38] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
39] => Array
        (
            [
0] => 304
            
[1] => NOT
        
)

    [
40] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
41] => Array
        (
            [
0] => 304
            
[1] => NULL
        
)

    [
42] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
43] => Array
        (
            [
0] => 327
            
[1] => default
        )

    [
44] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
45] => Array
        (
            [
0] => 312
            
[1] => '0'
        
)

    [
46] => ,
    [
47] => Array
        (
            [
0] => 356
            
[1] => 
  
        )

    [
48] => `
    [49] => Array
        (
            [0] => 304
            [1] => forum_id
        )

    [50] => 
`
    [
51] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
52] => Array
        (
            [
0] => 304
            
[1] => smallint
        
)

    [
53] => (
    [
54] => Array
        (
            [
0] => 302
            
[1] => 5
        
)

    [
55] => )
    [
56] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
57] => Array
        (
            [
0] => 304
            
[1] => unsigned
        
)

    [
58] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
59] => Array
        (
            [
0] => 304
            
[1] => NOT
        
)

    [
60] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
61] => Array
        (
            [
0] => 304
            
[1] => NULL
        
)

    [
62] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
63] => Array
        (
            [
0] => 327
            
[1] => default
        )

    [
64] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
65] => Array
        (
            [
0] => 312
            
[1] => '0'
        
)

    [
66] => ,
    [
67] => Array
        (
            [
0] => 356
            
[1] => 
  
        )

    [
68] => `
    [69] => Array
        (
            [0] => 304
            [1] => poster_id
        )

    [70] => 
`
    [
71] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
72] => Array
        (
            [
0] => 304
            
[1] => mediumint
        
)

    [
73] => (
    [
74] => Array
        (
            [
0] => 302
            
[1] => 8
        
)

    [
75] => )
    [
76] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
77] => Array
        (
            [
0] => 304
            
[1] => NOT
        
)

    [
78] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
79] => Array
        (
            [
0] => 304
            
[1] => NULL
        
)

    [
80] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
81] => Array
        (
            [
0] => 327
            
[1] => default
        )

    [
82] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
83] => Array
        (
            [
0] => 312
            
[1] => '0'
        
)

    [
84] => ,
    [
85] => Array
        (
            [
0] => 356
            
[1] => 
  
        )

    [
86] => `
    [87] => Array
        (
            [0] => 304
            [1] => post_time
        )

    [88] => 
`
    [
89] => Array
        (
            [
0] => 356
            
[1] =>  
        )

    [
90] => Array
        (
            [</