php.de

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

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 20.08.2009, 23:23  
Benutzer
 
Benutzerbild von dunst0
 
Registriert seit: 30.07.2009
Beiträge: 56
PHP-Kenntnisse:
Fortgeschritten
dunst0 befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] anonyme funktion und zusätzlich variablen übergeben

PHP-Code:
    $cache = array('text' => 'das ist ein text');
    
$parsed_text preg_replace_callback(
        
'/text/',
        
        function (
$treffer) {
            global 
$cache;
            return 
$cache[$treffer[0]];
        },
        
        
$text
    
); 
gibt es eine möglich keit das ohne global zu machen?
ich hoffe ich bin grad nicht nur einfach zu blockiert um drauf zu kommen.

lg dunst



//EDIT:
Tschuldigung bin selbst drauf gekommen.

PHP-Code:
    $cache = array('text' => 'das ist ein text');
    
$parsed_text preg_replace_callback(
        
'/text/',
        
        function (
$treffer) use ($cache) {
            return 
$cache[$treffer[0]];
        },
        
        
$text
    
); 

Geändert von dunst0 (20.08.2009 um 23:31 Uhr).
dunst0 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 20.08.2009, 23:26  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Was spricht denn gegen einen 2. Parameter?
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 20.08.2009, 23:32  
Benutzer
 
Benutzerbild von dunst0
 
Registriert seit: 30.07.2009
Beiträge: 56
PHP-Kenntnisse:
Fortgeschritten
dunst0 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Was spricht denn gegen einen 2. Parameter?
nicht möglich in diesem zusammenhang gibt dabei ein missing parameter error
dunst0 ist offline   Mit Zitat antworten
Alt 21.08.2009, 10:08  
Erfahrener Benutzer
 
Registriert seit: 03.06.2009
Beiträge: 140
PHP-Kenntnisse:
Anfänger
thomasE befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
PHP-Code:
    $cache = array('text' => 'das ist ein text');
    
$parsed_text preg_replace_callback(
        
'/text/',
        
        function (
$treffer) use ($cache) {
            return 
$cache[$treffer[0]];
        },
        
        
$text
    
); 
du solltest aber bedenken, das solche closures erst ab PHP 5.3 funktionieren, sprich das auf dem späteren Arbeitsserver auch vorhanden sein muss.

bei deinem konkreten Beispiel hätte ich das mit str_replace oder preg_replace (wenn es reguläre Ausdrücke sein müssen) gemacht
PHP-Code:
$parsed_text str_replace(
    
array_keys($cache),
    
$cache,
    
$text
); 
thomasE ist offline   Mit Zitat antworten
Alt 21.08.2009, 13:57  
Benutzer
 
Benutzerbild von dunst0
 
Registriert seit: 30.07.2009
Beiträge: 56
PHP-Kenntnisse:
Fortgeschritten
dunst0 befindet sich auf einem aufstrebenden Ast
Standard

Also ja man kann es natürlich auch ohne closures machen.
nur wenn ich davon ausgehen kann das die ziel umgebung das immer das aktuelle php hat,
dann kann ich auch aktuellere funktionen von php nutzen.

Das ganze soll BBCode ersatz werden, also BBCode durch Html austauschen.
Ich hatte sowas schon mal mit den guten alten substr, strpos, strlen umgesetzt, als ich anfing php zu lernen.

Mein Ziel war den BBCode ersatzt so flexibel wie möglich zu machen, so das die BBCodes frei definiert werden können.

Daher kam ich bei der Überarbeitung meines Codes auf die idee,
ob das mit regulären Ausdrücken nicht viel sauberer geht.

Folgend ist mein Ansatz daszu. Dieser hat nur leider das Problem,
er erlaubt keine ineinander Verschachtelung von BBCodes, was nicht sehr praktisch ist.

Hier sind ja sehr viele regex experten, hat nicht jemand von euch nen hinweis, was ich versuchen könnte?

vielen dank

PHP-Code:
$cache['[b]#text#[/b]'] =
array    (
'html'    => '<span class="bold">#text#</span>',
          
'pre'     => '');
$cache['[quote]#text#[/quote]'] =
array    (
'html'    => '<div class="quote"><div class="title">Quote:</div><div class="gr2">#text#</div></div>',
          
'pre'     => '');

$text '[b]Das ist Bold[/b] [quote]Das ist ein Zitat[quote]haha[/quote][/quote]';

$parsed_text preg_replace_callback(
    
'/\[([a-zA-Z0-9\-\_]+)(=(.+))?\](.*)\[\/\1\]/isU',
    
    function (
$treffer) use ($cache) {
        
$tag strtolower($treffer[1]); //BBCode Tag
        
        
$text $treffer[4]; //BBCode Text
        
        
$wert = (!empty($treffer[3]) ? $treffer[3] : $text); //BBCode Wert
        
if (preg_match('/^http:\/\/|https:\/\/|ftp:\/\/|ftps:\/\//i'$wert)) //Wert enthält Link -> urlencode
            
$wert urlencode($wert);
            
        
$search '['.$tag.(!empty($treffer[2]) ? '=#wert#' '').']#text#[/'.$tag.']'//Suchstring erzeugen
        
        
$replace preg_replace ( array('/#TEXT#/i''/#WERT#/i'), array($text$wert), $cache[$search]['html'] );
        return 
$replace;
    },
    
    
$text
);
echo 
$parsed_text

Geändert von dunst0 (21.08.2009 um 14:06 Uhr).
dunst0 ist offline   Mit Zitat antworten
Alt 21.08.2009, 14:32  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 5.234
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

Verschachtelung müsstest du auch dadurch hinbekommen, dass du beispielsweise dein replace wiedeholst, sollte es mindestens einen Treffer gefunden haben.
__________________
www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih
mepeisen ist gerade online   Mit Zitat antworten
Alt 21.08.2009, 15:03  
Benutzer
 
Benutzerbild von dunst0
 
Registriert seit: 30.07.2009
Beiträge: 56
PHP-Kenntnisse:
Fortgeschritten
dunst0 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von mepeisen Beitrag anzeigen
Verschachtelung müsstest du auch dadurch hinbekommen, dass du beispielsweise dein replace wiedeholst, sollte es mindestens einen Treffer gefunden haben.
also wenn ich das richtig verstehe, dann meinst du das was ich grade selbst am überlegen war.

den replace laufen lassen und den innersten BBCode ersetzen
dannach wieder holen und wieder den innersten ersetzen.


aus:
Code:
[meincode]
   [meincode]lala[/meincode]
[/meincode]
wird:

Code:
[meincode]
   <format>lala</format>
[/meincode]
dannach noch mal ersten und man erhält:

Code:
<format>
   <format>lala</format>
</format>

dafür müsste ich den regulären ausdruck so weit abändern das immer nur ein BBCode gefunden wird der kein weitern BBCode enthält.

ich hab das mal getestet und einfachmal direkt ausgeschlossen das der benutzer [ und] im normalen text verwenden darf, dann klappt das,

nur nun sitze ich vor dem problem, den regulären ausdruck zu verfeinern,
[ und ] sollen im normalen text erlaubt sein, und dennoch sollen nur BBCodes gefunden werden die keine weitern BBCodes enthalten.

ich finde BBCode mit diesem regulären ausdruck
Code:
/\[([a-zA-Z0-9\-\_]+)(=(.+))?\](.*)\[\/\1\]/isU
wenn ich nur versuche ein BBCode finden will der kein BBCode enthält war mein versuch [ und ] auszunehmen
Code:
/\[([a-zA-Z0-9\-\_]+)(=(.+))?\]([^\[\]]*)\[\/\1\]/isU
so nun möchte ich aber nur BBCode finden die keine anderen BBCodes enthalten, auch soll [ und ] im text erlaubt sein?
ich bin grad am ausprobieren mit dem RegExp-Evaluator, aber ich komme nicht drauf

Geändert von dunst0 (21.08.2009 um 15:40 Uhr).
dunst0 ist offline   Mit Zitat antworten
Alt 21.08.2009, 15:37  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 5.234
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

Du bringst deinen RegEx nur bei, dass es immer den kleinstmöglichen inneren Teil konsumiert oder den größtmöglichen inneren Teil. Ob du mit dem äußersten anfängst oder dem innersten sollte hoffentlich egal sein...
Für beides (konsumieren größtmöglicher oder kleinsmöglicher Teil) gibt es irgendein Prefix oder Suffix.
__________________
www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih
mepeisen ist gerade online   Mit Zitat antworten
Alt 21.08.2009, 16:30  
Benutzer
 
Benutzerbild von dunst0
 
Registriert seit: 30.07.2009
Beiträge: 56
PHP-Kenntnisse:
Fortgeschritten
dunst0 befindet sich auf einem aufstrebenden Ast
Standard

klappt danke schön

PHP-Code:
    while (preg_match ('/\[([a-zA-Z0-9\-\_]+)(=(.+))?\](.*)\[\/\1\]/isU'$text)) {
        
$text preg_replace_callback(
            
'/\[([a-zA-Z0-9\-\_]+)(=(.+))?\](.*)\[\/\1\]/isU',
            
            function (
$treffer) use ($cache) {
                
$tag strtolower($treffer[1]); //BBCode Tag
                
                
$text $treffer[4]; //BBCode Text
                
                
$wert = (!empty($treffer[3]) ? $treffer[3] : $text); //BBCode Wert
                
                
$search '['.$tag.(!empty($treffer[2]) ? '=#wert#' '').']#text#[/'.$tag.']'//Suchstring erzeugen
                
                
$replace preg_replace ( array('/#TEXT#/i''/#WERT#/i'), array($text$wert), $cache[$search]['html'] );
                return 
$replace;
            },
            
            
$text
        
);
    } 
dunst0 ist offline   Mit Zitat antworten
Alt 21.08.2009, 17:23  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Anders herum müßte es auch gehen, habe ich neulich von unserer RegExp Eule gelernt:

Zitat:
Recursive patterns
The special item (?R) is provided for the specific case of recursion. This PCRE pattern solves the parentheses problem (assume the PCRE_EXTENDED option is set so that white space is ignored): \( ( (?>[^()]+) | (?R) )* \)

First it matches an opening parenthesis. Then it matches any number of substrings which can either be a sequence of non-parentheses, or a recursive match of the pattern itself (i.e. a correctly parenthesized substring). Finally there is a closing parenthesis.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch 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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
In Funktion auf Variablen außerhalb zugreifen Cartman1984 PHP Tipps 2009 7 03.06.2009 19:55
[Erledigt] Variablen mittels POST übergeben pierrebln PHP Tipps 2009 10 27.03.2009 09:21
[Erledigt] Variablen in andere Dateien übergeben Nobs PHP Tipps 2009 12 12.02.2009 09:15
Event ändern und dabei variablen übergeben cycap JavaScript, Ajax und mehr 8 14.05.2008 07:32
Alle Variablen einer Funktion in andere übergeben MaMo-Net PHP-Fortgeschrittene 9 22.10.2005 19:22
Wie kann man alles Variablen übergeben ?? PHP Tipps 2005-2 14 11.09.2005 22:19
Variablen werden per post nicht übergeben sinai PHP Tipps 2005-2 9 12.08.2005 10:04
(schnellere) Funktion zum Zusammenfassen von CSS PHP-Fortgeschrittene 21 08.08.2005 16:47
Variablen an den Interpreter übergeben PHP Tipps 2005-2 24 04.07.2005 21:43
Variablen werden nicht übergeben PHP Tipps 2005-2 6 26.06.2005 22:08
[Erledigt] Wie kann ich beliebig viele Werte an eine Funktion übergeben PHP Tipps 2005 11 25.01.2005 10:44
komplexe Variablen übergeben? PHP Tipps 2004-2 8 02.12.2004 08:29
[Erledigt] Parameter an eine funktion übergeben PHP Tipps 2004 9 18.08.2004 14:14
Variablen per adresse übergeben rocco PHP Tipps 2004 7 24.07.2004 12:03
[Erledigt] Referenz auf Funktion übergeben PHP-Fortgeschrittene 7 20.07.2004 09:51

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
regex eule, java anonyme funktion, php anonyme funktionen schachteln, php variablen an anonyme funkltion übergeben, php anonyme funktion variable übergeben, anonyme funktion array, php anonyme variablen, functionswerte in function übergeben php, php anonyme funktion variable weitergeben, php anonyme funktion wert in variabel, parameter an anonyme funktion übergeben, this an anonyme funktion übergeben, php anonyme funktion global, function() variable übergeben, variable aus anonymer function benutzen, php variablen in anonymen funktionen, javascript anonyme funktionen verschachteln, php 5.3 preg_match array mathes übergabe per referenz, javascript anonyme funktion daten übergeben, java anonyme funktionen

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:47 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