Question

J'avais fait un logiciel de note personnelle en PHP, donc je peux stocker et organiser mes notes et souhaité pour un bon format simple de les écrire dans.

Je l'avais fait en Markdown mais il lui était un peu confus et il n'y avait pas mise en évidence de syntaxe simple, donc je ne bbcode avant et a souhaité mettre en oeuvre.

Maintenant, pour GeSHi que je souhaite vraiment mettre en œuvre (la syntaxe surligneur), il nécessite le code le plus simple comme ceci:

$geshi = new GeSHi($sourcecode, $language);
$geshi->parse_code();

Maintenant, c'est la partie facile, mais ce que je veux faire est de permettre à mon bbcode de l'appeler.

Mon actuelle expression régulière pour correspondre à une composée [syntaxe = cpp] [/ syntaxe] bbcode est la suivante:

preg_replace('#\[syntax=(.*?)\](.*?)\[/syntax\]#si' , 'geshi(\\2,\\1)????', text);

Vous remarquerez que je capture la langue et le contenu, comment diable aurais-je le connecter au code GeSHi?

preg_replace semble simplement être en mesure de le remplacer par une chaîne pas une « expression », je ne suis pas sûr de savoir comment utiliser ces deux lignes de code pour GeSHi là-haut avec les données saisies ..

Je suis vraiment excité à propos de ce projet et je souhaite surmonter cela.

Était-ce utile?

La solution

J'ai écrit cette classe un certain temps, la raison de la classe était de permettre une personnalisation facile / analyse syntaxique. Peut-être un peu exagéré, mais fonctionne bien et je en avais besoin surpuissant pour mon application. L'utilisation est assez simple:

$geshiH = new Geshi_Helper();
$text = $geshiH->geshi($text); // this assumes that the text should be parsed (ie inline syntaxes)

---- OU ----

$geshiH = new Geshi_Helper();
$text = $geshiH->geshi($text, $lang);  // assumes that you have the language, good for a snippets deal

Je devais faire un peu couper d'autres articles personnalisés que j'avais, mais en attendant aucune erreur de syntaxe du hachage il devrait fonctionner. Sentez-vous libre de l'utiliser.

<?php

require_once 'Geshi/geshi.php';

class Geshi_Helper 
{
    /**
     * @var array Array of matches from the code block.
     */
    private $_codeMatches = array();

    private $_token = "";

    private $_count = 1;

    public function __construct()
    {
        /* Generate a unique hash token for replacement) */
        $this->_token = md5(time() . rand(9999,9999999));
    }

    /**
     * Performs syntax highlights using geshi library to the content.
     *
     * @param string $content - The context to parse
     * @return string Syntax Highlighted content
     */
    public function geshi($content, $lang=null)
    {
        if (!is_null($lang)) {
            /* Given the returned results 0 is not set, adding the "" should make this compatible */
            $content = $this->_highlightSyntax(array("", strtolower($lang), $content));
        }else {
            /* Need to replace this prior to the code replace for nobbc */
            $content = preg_replace('~\[nobbc\](.+?)\[/nobbc\]~ie', '\'[nobbc]\' . strtr(\'$1\', array(\'[\' => \'&#91;\', \']\' => \'&#93;\', \':\' => \'&#58;\', \'@\' => \'&#64;\')) . \'[/nobbc]\'', $content);

            /* For multiple content we have to handle the br's, hence the replacement filters */
            $content = $this->_preFilter($content);

            /* Reverse the nobbc markup */
            $content = preg_replace('~\[nobbc\](.+?)\[/nobbc\]~ie', 'strtr(\'$1\', array(\'&amp;#91;\' => \'[\', \'&amp;#93;\' => \']\', \'&amp;#58;\' => \':\', \'&amp;#64;\' => \'@\'))', $content);

            $content = $this->_postFilter($content);
        }

        return $content;
    }

    /**
     * Performs syntax highlights using geshi library to the content.
     * If it is unknown the number of blocks, use highlightContent
     * instead.
     *
     * @param string $content - The code block to parse
     * @param string $language - The language to highlight with
     * @return string Syntax Highlighted content
     * @todo Add any extra / customization styling here.
     */
    private function _highlightSyntax($contentArray)
    {
        $codeCount = $contentArray[1];

        /* If the count is 2 we are working with the filter */
        if (count($contentArray) == 2) {
            $contentArray = $this->_codeMatches[$contentArray[1]];
        }

        /* for default [syntax] */
        if ($contentArray[1] == "")
            $contentArray[1] = "php";

        /* Grab the language */
        $language = (isset($contentArray[1]))?$contentArray[1]:'text';

        /* Remove leading spaces to avoid problems */
        $content = ltrim($contentArray[2]);

        /* Parse the code to be highlighted */
        $geshi = new GeSHi($content, strtolower($language));
        return $geshi->parse_code();
    }

    /**
     * Substitute the code blocks for formatting to be done without
     * messing up the code.
     *
     * @param array $match - Referenced array of items to substitute
     * @return string Substituted content
     */
    private function _substitute(&$match)
    {
        $index = sprintf("%02d", $this->_count++);
        $this->_codeMatches[$index] = $match;
        return "----" . $this->_token . $index . "----";
    }

    /**
     * Removes the code from the rest of the content to apply other filters.
     *
     * @param string $content - The content to filter out the code lines
     * @return string Content with code removed.
     */
    private function _preFilter($content)
    {
        return preg_replace_callback("#\s*\[syntax=(.*?)\](.*?)\[/syntax\]\s*#siU", array($this, "_substitute"), $content);
    }

    /**
     * Replaces the code after the filters have been ran.
     *
     * @param string $content - The content to replace the code lines
     * @return string Content with code re-applied.
     */
    private function _postFilter($content)
    {
        /* using dashes to prevent the old filtered tag being escaped */
        return preg_replace_callback("/----\s*" . $this->_token . "(\d{2})\s*----/si", array($this, "_highlightSyntax"), $content);
    }
}
?>

Autres conseils

Il me semble que vous avez déjà obtenu le droit regex. Votre problème réside dans l'invocation, donc je suggère faire une fonction d'emballage:

function geshi($src, $l) {
    $geshi = new GeSHi($sourcecode, $language);
    $geshi->parse_code();
    return $geshi->how_do_I_get_the_results();
}

Maintenant, cela devrait normalement suffire, mais le code source est susceptible de contenir des guillemets simples ou Dobule lui-même. vous ne pouvez donc écrire preg_replace(".../e", "geshi('$2','$1')", ...) que vous auriez besoin. (Notez que $ 1 et $ 2 'ont besoin de guillemets parce que preg_replace remplace simplement les $ 1, $ 2 espaces réservés, mais cela doit être un code en ligne valide php).

C'est pourquoi vous devez utiliser preg_replace_callback pour éviter des problèmes échapper au / e code de remplacement de exec. Ainsi, par exemple:

preg_replace_callback('#\[syntax=(.*?)\](.*?)\[/syntax\]#si' , 'geshi_replace', $text);

Et je ferais un deuxième emballage, mais vous pouvez le combiner avec le code d'origine:

function geshi_replace($uu) {
    return geshi($uu[2], $uu[1]);
}

Utilisation preg_match:

$match = preg_match('#\[syntax=(.*?)\](.*?)\[/syntax\]#si', $text);
$geshi = new GeSHi($match[2], $match[1]);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top