php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 04.04.2011, 16:10  
Erfahrener Benutzer
 
Benutzerbild von fireweasel
 
Registriert seit: 20.03.2010
Beiträge: 474
PHP-Kenntnisse:
Fortgeschritten
fireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblick
fireweasel eine Nachricht über ICQ schicken fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken fireweasel eine Nachricht über Skype™ schicken
Standard

Fünfmal schneller hätte ich jetzt nicht vermutet.

Zitat:
Zitat von mermshaus
Wobei ich da mal wieder nicht beurteilen kann, was PCRE intern so treibt. ...
Scheint wieder mal die Faustregel zu bestätigen, Operationen – selbst relativ kleine – eher nicht in PHP-Code durchzuführen.
Wenn ich die Wahl habe, verlasse ich mich lieber auf Philip Hazel als auf Rasmus Lerdorf.

Zitat:
Zitat von nikosch Beitrag anzeigen
Wow, man lernt echt nie aus, bei regulären Ausdrücken.
Die "Subroutinen" gibts schon eine Weile in PCRE. Sie werden nur selten erwähnt. Und der Müll, den sie im Ergebnis-Array produzieren ist auch unschön.

Zitat:
Sehr schöne Lösung, ...
Ja, wenn man Sprachen wie BRAINFUCK liebt, weiß man auch die Schönheit einer Klammer-, Fragezeichen- und Backslash-Sammlung wie in diesem Regex zu schätzen.

Zitat:
Zitat von nikosch
... (auch wenn ich jetzt noch nicht probiert habe, ob es funktioniert) ...
Zitat:
Zitat von mermshaus
Für den Demostring scheint die Lösung zu funktionieren.
Mit den angegebenen zwei Test-Strings|-Arrays läufts. Das Darstellen|Escapen von Backslashes ist natürlich noch ungelöst. Wenn es eine Standard-Shell-Parameter-Konvention geben sollte, müsste man die auch nachbauen können.
fireweasel ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 04.04.2011, 16:43  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

In meiner Variante steckte noch Optimierungspotential…

PHP-Code:
$activeChar substr($input$i1); # langsam
$activeChar $input[$i];            # schnell 
Wer's ausprobieren oder schlauere Benchmarks als ich anwenden möchte:

PHP-Code:
<?php // Encoding: UTF-8

/**
 *
 * @param string $input
 * @return array
 */
function getArgsArrayNonPreg($input)
{
    
$args = array();

    
$argBuffer '';

    
$isInString         false;
    
$isInEscapeSequence false;

    
$activeStringDelimiter '';

    
$inputLength strlen($input);

    for (
$i 0$i $inputLength$i++) {
        
#$activeChar = substr($input, $i, 1);
        
$activeChar $input[$i];

        switch (
$activeChar) {
            
// Space
            
case ' ':
                if (
$isInEscapeSequence) {
                    
$isInEscapeSequence false;
                    
$argBuffer .= $activeChar;
                } else if (
$isInString) {
                    
$argBuffer .= $activeChar;
                } else {
                    
// Complete argument read,
                    // push buffer to list (if there is content),
                    // flush buffer
                    
if ($argBuffer !== '') {
                        
$args[] = $argBuffer;
                        
$argBuffer '';
                    }
                }
                break;

            
// String delimiter
            
case '"':
            case 
'\'':
                if (
$isInEscapeSequence) {
                    
$isInEscapeSequence false;
                    
$argBuffer .= $activeChar;
                } else if (
$isInString) {
                    if (
$activeStringDelimiter === $activeChar) {
                        
$isInString false;
                    }
                    
$argBuffer .= $activeChar;
                } else {
                    
$isInString true;
                    
$activeStringDelimiter $activeChar;
                    
$argBuffer .= $activeChar;
                }
                break;

            
// Escape char
            
case '\\':
                if (
$isInEscapeSequence) {
                    
$isInEscapeSequence false;
                    
$argBuffer .= $activeChar;
                } else {
                    
$isInEscapeSequence true;
                    
$argBuffer .= $activeChar;
                }
                break;

            
// Other char
            
default:
                if (
$isInEscapeSequence) {
                    
$isInEscapeSequence false;
                    
$argBuffer .= $activeChar;
                } else {
                    
$argBuffer .= $activeChar;
                }
                break;
        }
    }

    if (
$argBuffer !== '') {
        
$args[] = $argBuffer;
    }

    return 
$args;
}

/**
 *
 * @param string $input
 * @return array
 */
function getArgsArrayPregFireweasel($input)
{
    
$pcre '/(?:
        # q, qn
            (?:"(?:\x5C"|[^"])+(?:"|\z)|\'(?:\x5C\'|[^\'])+(?:\'|\z))
            (?:(?:\x5C\s|[\x21\x23-\x26\x28-\x9F\xA1-\xFF])+)?
        |
        # n, nq, nqn
            (?:\x5C\s|[\x21\x23-\x26\x28-\x9F\xA1-\xFF])+
            (?:
                (?:"(?:\x5C"|[^"])+(?:"|\z)|\'(?:\x5C\'|[^\'])+(?:\'|\z))
                (?:(?:\x5C\s|[\x21\x23-\x26\x28-\x79\xA1-\xFF])+)?
            )?
        )/x'
;

    
$matches = array();

    
preg_match_all($pcre$input$matches);

    return 
$matches[0];
}



$test = <<<'EOT'
'b' äö ß "äöüc d" e"\" f" ' g" ' '\'h' i ßj k" l"m n"\""
EOT;

$test str_repeat($test ' '10);



header('content-type: text/html; charset=utf-8');

$iterations 1000;



echo 
'<div style="float: left;">';
    
$startTime microtime(true);

    for (
$i 0$i $iterations$i++) {
        
$args getArgsArrayPregFireweasel($test);
    }

    echo 
microtime(true) - $startTime"\n";

    
var_dump(getArgsArrayPregFireweasel($test));
echo 
'</div>';



echo 
'<div style="float: left;">';
    
$startTime microtime(true);

    for (
$i 0$i $iterations$i++) {
        
$args getArgsArrayNonPreg($test);
    }

    echo 
microtime(true) - $startTime"\n";

    
var_dump(getArgsArrayNonPreg($test));
echo 
'</div>';
Edit: foreach (str_split($input) as $activeChar) ist bei mir noch einen Tick schneller, verbraucht aber mehr Speicher.
__________________
Blog | Buch | Kaloa

Geändert von mermshaus (04.04.2011 um 16:51 Uhr).
mermshaus ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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 an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
fireweasel subroutine regex

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:32 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum