zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden kleinen highlighter schreiben

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 07.09.2013, 18:19
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 17.08.2013
Beiträge: 242
mymaksimus befindet sich auf einem aufstrebenden Ast
Standard kleinen highlighter schreiben

Hallo, ich wollte mir gerne einen kleinen java highlighter mit php schreiben, nur mit den minimalsten funktionen also strings erkenn und so weiter. Leider kenn ich mich mit regex nicht so gut aus... Also die Frage: Sagen wir mal ich habe ein array mit keywords, und einen string:

PHP-Code:
$keywords = array(
    
"public",
    
"static",
    
"void",
    
"class"
);
$text "public static void main(){}" 
Wie könnte ich jetzt dieses array in einen regex und preg_replace einbinden? geht das überhaupt? Oder ist das ein falscher ansatz?

danke!

Edit: und backreference funktionieren bei mir auch nicht...
PHP-Code:
//sollte doch eigentlich strings ersetzen, oder?
echo preg_replace('/".+"/s''<span class="string">$1</span>;'$line);
//gibt <span class="string"></span> zurück. 

Geändert von mymaksimus (07.09.2013 um 19:21 Uhr)
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 07.09.2013, 23:58
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 13.07.2006
Beiträge: 745
mermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblick
Standard

Du musst das im regulären Ausdruck klammern (runde Klammern), was du später referenzieren willst.

Früher oder später wirst du aber vermutlich einen echten Lexer/Parser benötigen.

Ich habe so was hier für CSS mal angefangen. Das sollte dir ne Idee geben:

PHP-Code:
<?php

class CssTokenizer
{
    protected 
$chars;
    protected 
$tokens;

    
/**
     * Get character at index
     *
     * @param int $index
     * @return string
     */
    
protected function gc($index)
    {
        
$c null;

        if (
$index count($this->chars)) {
            
$c $this->chars[$index];
        }

        return 
$c;
    }

    
/**
     *
     * @param string $input
     */
    
public function tokenize($input)
    {
        
$this->chars preg_split('/(?<!^)(?!$)/u'$input);
        
$this->tokens = array();
        
$n 0;
        
$length mb_strlen($input);
        
$isInComment  false;
        
$isInString   false;
        
$isInRuleSet false;
        
$stringDelimiter '';
        
$buffer '';

        while (
$n $length) {
            
$c $this->chars[$n];

            switch (
$c) {
                case 
'/':
                    if (!
$isInComment && !$isInString) {
                        if (
$this->gc($n 1) === '*') {
                            
$isInComment true;
                            
$this->tokens[] = array('default'$buffer);
                            
$buffer '';
                            
$buffer .= $c $this->gc($n 1);
                            
$n += 2;
                        } else {
                            
$buffer .= $c;
                            
$n++;
                        }
                    } else {
                        
$buffer .= $c;
                        
$n++;
                    }
                    break;

                case 
'*':
                    if (
$isInComment) {
                        if (
$this->gc($n 1) === '/') {
                            
$buffer .= $c $this->gc($n 1);
                            
$n += 2;
                            
$this->tokens[] = array('comment'$buffer);
                            
$isInComment false;
                            
$buffer '';
                        } else {
                            
$buffer .= $c;
                            
$n++;
                        }
                    } else {
                        
$buffer .= $c;
                        
$n++;
                    }
                    break;

                case 
'"':
                case 
'\'':
                    if (!
$isInComment && !$isInString) {
                        
$isInString true;
                        
$stringDelimiter $c;
                        
$this->tokens[] = array('default'$buffer);
                        
$buffer '';
                        
$buffer .= $c;
                        
$n++;
                    } else {
                        if (
$isInString && $stringDelimiter === $c) {
                            
$isInString false;
                            
$stringDelimiter '';
                            
$buffer .= $c;
                            
$n++;
                            
$this->tokens[] = array('string'$buffer);
                            
$buffer '';
                        } else {
                            
$buffer .= $c;
                            
$n++;
                        }
                    }
                    break;

                case 
'{':
                    if (!
$isInComment && !$isInString) {
                        if (!
$isInRuleSet) {
                            
$isInRuleSet true;
                            
$this->tokens[] = array('default'$buffer);
                            
$this->tokens[] = array('rule_start'$c);
                            
$buffer '';
                            
$n++;
                        } else {
                            
$this->tokens[] = array('default'$buffer);
                            
$this->tokens[] = array('error'$c);
                            
$buffer '';
                            
$n++;
                        }
                    } else {
                        
$buffer .= $c;
                        
$n++;
                    }
                    break;

                case 
'}':
                    if (!
$isInComment && !$isInString) {
                        if (
$isInRuleSet) {
                            
$isInRuleSet false;
                            
$this->tokens[] = array('default'$buffer);
                            
$this->tokens[] = array('rule_end'$c);
                            
$buffer '';
                            
$n++;
                        } else {
                            
$this->tokens[] = array('default'$buffer);
                            
$this->tokens[] = array('error'$c);
                            
$buffer '';
                            
$n++;
                        }
                    } else {
                        
$buffer .= $c;
                        
$n++;
                    }
                    break;

                default:
                    
$buffer .= $c;
                    
$n++;
                    break;
            }
        }

        if (
$buffer !== '') {
            
$this->tokens[] = array('default'$buffer);
        }

        
// Remove empty tokens

        
$oldTokens $this->tokens;
        
$this->tokens = array();

        foreach (
$oldTokens as $token) {
            if (
$token[1] !== '') {
                
$this->tokens[] = $token;
            }
        }

        return 
$this->tokens;
    }
}

$input = <<<EOT
/* Mein tolles Stylesheet */
#head{
    width: 1014px;
    height: 34px;
    /* } */
    background: #D3D3D3;
    padding: 5px;
    content: "Hello 'World!'";
    border-style: solid;
    border-width: 5px;
    border-color: #262626;
}

/*
    "Hello 'World!'"

    'This "is" a test'

    /*

    test {
        content: 'Hello "World!"';
    }
*/
#navigation{
    list-style-type: none;
    display: inline;
    vertical-align: bottom;
    content: 'This "is" a test.';
}

/* Ein weiterer Kommentar */
#navigation li{
    display: block;
    position: relative;
    float: left;
}

selector {
    /* Rule set */
    {
}}
EOT;

$c = new CssTokenizer();
$tokens $c->tokenize($input);

$output '';

$e = function ($s) {
    return 
htmlspecialchars($sENT_QUOTES'UTF-8');
};

$output '';

foreach (
$tokens as $token) {
    list(
$class$content) = $token;

    
$output .= '<span class="' $e($class) . '">' $e($content) . '</span>';
}

?><!DOCTYPE html>

<html lang="en">

    <head>
        <meta charset="UTF-8" />
        <title>CSS Parser</title>
        <style>
/*<![CDATA[*/
pre {
    border: 1px solid #ccc;
    padding: 5px;
}

.string {
    background: #f0f0f0;
    color: green;
}

.comment {
    color: orange;
}

.rule_start, .rule_end {
    color: red;
}

.error {
    background: red;
    color: white;
}

/*]]>*/
        </style>
    </head>

    <body>

        <pre><code><?=$output?></code></pre>

    </body>

</html>
Mit Zitat antworten
Sponsored Links
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Warum hat Grafik einen kleinen Abstand im Fussbereich? BuchwaldM CSS 5 22.01.2011 19:17
Verwaltung einer kleinen Website PSchiller Offtopic 13 12.08.2008 22:43
Abstände zw. kleinen Grafiken weg bekommen? marcee CSS 12 03.06.2006 16:03
Bitte um kleinen Firefox Sitecheck buergi Site- und Layoutcheck 4 25.04.2005 20:25
Die kleinen Buttons Shark13 Offtopic 8 23.07.2004 10:48


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:11 Uhr.