Scripts

functie preg_highlight

Ik vond het voor mezelf erg wenselijk om snel en nauwkeurig de resultaten van een regular expression snel te kunnen weergeven. ik heb hiervoor een functie geschreven waarbij je vanalles kunt meegeven: patroon - ZONDER delimiter, ZONDER modifiers subject - de string waarin je wilt highlighten args - de argument als modifiers (deze kun je bitwise meegeven, bijv. caseless en dotall = PREG_HIGHLIGHT_CASELESS|PREG_HIGHLIGHT_DOTALL) en subpatroon die je eventueel kunt highlight als er vragen zijn hoor ik die graag;)

functie-preghighlight
<?php
error_reporting (E_ALL);

// paar defines voor extra typen
define ('PREG_HIGHLIGHT_CASELESS', 1);
define ('PREG_HIGHLIGHT_MULTILINE', 2);
define ('PREG_HIGHLIGHT_DOTALL', 4);
define ('PREG_HIGHLIGHT_EXTENDED', 8);

/*
*    string preg_highlight (string pattern, string subject[, int args[, int sub]])
*
*    @param    string    pattern
*    @param    string    subject
*    @param    integer   args      optional
*    @param    integer   sub       optional
*
*    @return   string
*/
function preg_highlight ($pattern, $subject, $args = 0, $sub = 0)
{
    // hoe moeten resultaten gehighlight worden
    // 1e %s = kleur, 2e %s = de text
    $highlight = '<span style="background-color: %s">%s</span>';
    // kleuren - all = hele match
    // sub = subpatroon
    $colors = array (
        'all' => '#808080', 
        'sub' => '#c0c0c0'
    );

    // het patroon, delimiter escapen
    $pattern = '/' . str_replace ('/', '\/', $pattern) . '/';

    // caseless
    if ($args & PREG_HIGHLIGHT_CASELESS)
    {
        $pattern .= 'i';
    }
    // multiline
    if ($args & PREG_HIGHLIGHT_MULTILINE)
    {
        $pattern .= 'm';
    }
    // dot match all
    if ($args & PREG_HIGHLIGHT_DOTALL)
    {
        $pattern .= 's';
    }
    // extended match - comments allowed
    if ($args & PREG_HIGHLIGHT_EXTENDED)
    {
        $pattern .= 'x';
    }

    // als er geen subpatroon aangegeven is
    if ($sub == 0)
    {
        // is de replacement simpel
        $replacement = sprintf ($highlight, $colors['all'], $sub);
    }
    // als er wel een subpatroon is
    else
    {
        // evaluaten als php
        $pattern .= 'e';

        // begin met replacement, de code moet goed intact gehouden worden
        $replacement = "' . str_replace ('\\" . $sub . "', '" . sprintf ($highlight, $colors['sub'], '\\' . $sub) . "', '\\0') . '";
        // en nu de complete replacement
        $replacement = "'" . sprintf ($highlight, $colors['all'], $replacement) . "'";
    }

    // return het resultaat
    return preg_replace ($pattern, $replacement, $subject);
} // ** END preg_highlight
// ** EOF **
?>

Reacties

0
Nog geen reacties.