Portal > Foren > PHP > PHP-Programmierung > RegEx weiter fassen und dann immer weiter nach innen gehen
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 19.02.2007, 19:49 Nach oben    #1
Corvin Gröning
 
Benutzerbild von Corvin
 
Registriert seit: 19.03.2005
Ort: S-H | Flensburg
Beiträge: 459
Standard RegEx weiter fassen und dann immer weiter nach innen gehen

Ein besserer Titel fiel mir nicht ein..

Ich habe folgenden Code:
PHP-Code:
<?php
$text 
"[x] [x] TEXT [/x] [/x]";
$text preg_replace("/\[x\](.*)\[\/x\]/isU""[y]\\1[/y]"$text);
echo 
$text;
?>
Die Ausgabe ist nun:
Zitat:
[y] [x] TEXT [/y] [/x]
Ich hätte die Ausgabe aber gerne so:
Zitat:
[y] [y] TEXT [/y] [/y]
Es soll also das erste und das letzte Tag ersetzt werden und dann soll, falls mehrere Tags ineinander verschachtelt sind, immer weiter nach innen gegangen werden beim Ersetzen.

Hat jemand eine Idee, wie man das geschickt anstellen könnte?

Ich hoffe das war verständlich..
__________________
Corvin ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.02.2007, 20:21 Nach oben    #2
Johannes Müller
 
Benutzerbild von $traight-$hoota
 
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 550
Standard

da wird dir nix anderes übrigbleiben, als die verschachtelungen "mitzuzählen" und z.B. in einem verscachtelten Array abzubildern.
PHP-Code:
<?php
$text 
"[x] [x] TEXT [/x] [/x]";
$structure $curr = array();
$parts preg_split("#\[/?x\]#"$textPREG_SPLIT_DELIM_CAPTURE);
$depth 0;
foreach(
$part in $parts){
    switch(
$part){
        case 
'[x]':
            
$depth++;
            
$t = array();
            
$curr[] = $t
            $curr 
$t;
            
$curr['parent'] = $curr;
        break;
        case 
'[/x]':
            
$depth--;
            
$curr $curr['parent'];
        break;
        default:
            
$curr[] = $part;
    }
}
?>
is nicht getestet, sollte aber nen vernünftigen tree liefern...
__________________
Weißt Bescheid - Scheiß wie weit
$traight-$hoota ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.02.2007, 22:03 Nach oben    #3
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.133
Standard

Code:
"`\[x\](.|?R)*\[/x\]`"
Könnte funktionieren. Hab selbst noch nie mit Rekursion in Regex gearbeitet, aber irgendwie so wirds sein.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.02.2007, 08:24 Nach oben    #4
Jonas
 
Benutzerbild von Artemis
 
Registriert seit: 03.06.2006
Beiträge: 244
Standard

http://www.phpfriend.de/forum/ftopic45053.html
__________________
Applikations-Programmierung:
BlitzMax, BlitzPlus

Webentwicklung:
PHP, (X)HTML, CSS, JavaScript, MySQL


Artemis ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.02.2007, 16:15 Nach oben    #5
Corvin Gröning
 
Benutzerbild von Corvin
 
Registriert seit: 19.03.2005
Ort: S-H | Flensburg
Beiträge: 459
Standard

Vielen Dank für die ganzen Anregungen!

Ich hab's jetzt so gelöst:
PHP-Code:
<?php
class Test
{
    
/**
     * The text..
     *
     * @access  protected
     * @var     string
     */
    
protected $text "";

    
/**
     * Number of open tag.
     *
     * @access  protected
     * @var     integer
     */
    
protected $openTags 0;

    
/**
     * Number of close tags.
     *
     * @access  protected
     * @var     integer
     */
    
protected $closeTags 0;

    
/**
     * blub.
     *
     * @access  public
     */
    
public function __construct() {
        
$this->main();
    }

    
/**
     * Replace Tags.
     *
     * @access  protected
     * @uses    this::$text
     * @uses    this::$openTags
     * @return  string
     */
    
protected  function main() {
        
$this->text "[x] [x] TEXT [/x] [/x]";

        
// count open tags and add number .. ( [x] => [x:nr] )
        
$this->text preg_replace("/\[x\]/isUe"'$this->countTags("x", "open")'$this->text);

        
// count close tags
        
$this->text preg_replace("/\[\/x\]/isUe"'$this->countTags("x", "close_count")'$this->text);

        
// and add number .. ( [/x] => [/x:nr] )
        
$this->text preg_replace("/\[\/x\]/isUe"'$this->countTags("x", "close")'$this->text);


        
// replace all tags
        
for( $i=1$i < ( count($this->openTags)+); $i++ ) {
            
$this->text preg_replace("/\[x\:$i\](.*)\[\/x\:$i\]/isU""[y]\\1[/y]"$this->text);
        }

        echo 
$this->text;
    }

    
/**
     * Count tags.
     *
     * @access  protected
     * @uses    this::$openTags
     * @uses    this::$closeTags
     * @return  string
     */
    
protected function countTags($tag$type) {
        switch( 
$type ) {
            case 
"open":
                
$this->openTags++;
                
$tag $tag .":" .$this->openTags;
                
$tag "[" .$tag ."]";
                break;

            case 
"close":
                
$tag $tag .":" .$this->closeTags;
                
$tag "[/" .$tag ."]";
                
$this->closeTags--;
                break;

            case 
"close_count":
                
$this->closeTags++;
                
$tag "[/" .$tag ."]";
                break;
        }

        return 
$tag;
    }

}
new 
Test;
?>
__________________

Geändert von Corvin (20.02.2007 um 16:27 Uhr)
Corvin ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 01.03.2007, 17:27 Nach oben    #6
Johannes Müller
 
Benutzerbild von $traight-$hoota
 
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 550
Standard

Ich habe auch mal ein recursives pattern geschrieben, dass verschachtelte divs mit class="section" finden soll.
Code:
#<div.*\sclass=".*section.*".*>(.|(?R))*</div>#sU
Dabei wird aber das jeweils erste tiefer liegende element zusammen mit dem parent-element gefunden. also hab ich folgendes probiert:
Code:
#<div.*\sclass=".*section.*".*>(.|(?R))*(?:</div>|<div.*\sclass=".*section.*".*>)#sU
Dabei wird zwar ein parent-element alleine gefunden, aber das erste child-element fehlt, weil der beginn des elements ja schon im vorhergehenden element als endbedingung verwendet wurde.

hab grad keinen plan, wie ich das lösen könnte...
__________________
Weißt Bescheid - Scheiß wie weit
$traight-$hoota ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 01.03.2007, 19:39 Nach oben    #7
Daniel Golowin
 
Registriert seit: 17.11.2005
Ort: Rheinland-Pfalz, Osthofen
Beiträge: 122
Standard

Irgendwie nervt es, jedes mal wenn man ein neuen Parser braucht sich immer wieder damit zu beschäftigen, bis er sich so verhält, wie man das gerne hätte. Deswegen schreibe gerade eine Klasse, bei der ich in dann das Verhalten konfigurieren kann. Dabei habe ich nochmal String- und Parser-Funktionen angeschaut.

preg_replace_callback könnte das sein, was ihr sucht:
http://www.php.net/manual/en/functio....php#id5812409
dago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

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 sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Regex Hilfe gesucht ljungi PHP-Programmierung 15 05.11.2006 15:41
Regex Hilfe bitte heohni PHP-Programmierung 9 06.05.2006 10:54
Agent Ransack - Suchen mit Regex und mehr robo47 Plauderecke 0 09.01.2006 21:18
Suche String.replaceAll ohne Regex Sicaine Allgemeine Java-Programmierung 7 20.09.2005 10:02
Regex Pattern bluefish Allgemeine Java-Programmierung 3 09.08.2004 17:04


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:01 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45