phpbar.de logo

Mailinglisten-Archive

[php] Wiederholungen begrenzen

[php] Wiederholungen begrenzen

Andreas Demmer php at andreas-demmer.de
Die Jun 15 15:04:57 CEST 2004


> René Thiel wrote:
>> Hat da jemand einen Vorschlag?

Hier mal ein Lösungsansatz, nicht sonderlich flexibel aber für den
Anfang tut er was er soll. Mit dem kannst Du ja weiterarbeiten.
Falls Du Fragen hast: Nur her damit! :-)

<?php
/**
 * @var constant
 * @desc maximale Anzahl erlaubter Wiederholungen einer Zeichenfolge
 */

define('ALLOWED_REPETITIONS', 3);

/**
 * @access access
 * @return string
 * @param array $repetition
 * @desc Reduziert Wiederholungen von Zeichenfolgen auf die erlaubte Anzahl
 */
function reduceRepetitions($repetition) {
    $chunk = guessChunk($repetition[1]);
    $replace = NULL;

    for($i = 1; $i <= ALLOWED_REPETITIONS; $i++) {
        $replace .= '\\1';
    }

    if(!is_bool($chunk)) {
        $chunk = preg_quote($chunk, '|');
        $returnValue =
preg_replace('|('.$chunk.'){'.ALLOWED_REPETITIONS.',}|', $replace,
$repetition);
    } else {
        $returnValue = $repetition;
    }

    return $returnValue[1];
}

/**
 * @return string
 * @param string $repetition
 * @desc versucht die sich wiederholende Zeichenfolge zu erkennen
 */
function guessChunk($repetition) {
    $chunk = FALSE;

    while(!$chunk) {
        $pos ? $pos = 1 : $pos++;
        $pos > strlen($repetition) ? $chunk = TRUE : $chunk = FALSE;

        $char = substr($repetition, 0, 1);
        $guessedChunk = substr($repetition, 0, strpos($repetition, $char,
$pos));

        $test = str_replace($guessedChunk, NULL, $repetition);
        $test == NULL ? $chunk = $guessedChunk : $chunk = FALSE;
    }

    return $chunk;
}

/* Teststring mit Wiederholungen */
$string =  ':):):):) :(:(:(:( lala doremidoremidoremidoremi';

/* Wiederholungen erkennen und ggfs. reduzieren */
$string = preg_replace_callback('|([^ ]+)+|', 'reduceRepetitions', $string);

die($string);
?>

Gruss,
Andreas

--
http://www.andreas-demmer.de



php::bar PHP Wiki   -   Listenarchive