 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
16.03.2005, 11:34
|
#1
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
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');
|
|
|
16.03.2005, 15:45
|
#2
|
|
Guest
Registriert seit: Aug 2002
|
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. 
|
|
|
16.03.2005, 22:25
|
#3
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
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 ?
|
|
|
16.03.2005, 22:41
|
#4
|
|
TP-Moderator
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
|
Ich schmeisse einfach mal das Wort Tokenizer in den Raum
Gruss
Jan
|
|
|
16.03.2005, 22:46
|
#5
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
 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 
Geändert von steffenk (16.03.2005 um 23:01 Uhr).
|
|
|
17.03.2005, 09:10
|
#6
|
|
TP-Moderator
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
|
mmhh... naja, ich meine eigentlich eher einen eigenen Tokenizer... Die Tokenizerfunktionen aus PHP können doch nur mit php-code umgehen, oder?
Gruss
Jan
|
|
|
17.03.2005, 09:33
|
#7
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
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
(
[ | | |