Reguläre Ausdrücke

Mag sein das er durch htmlspecialchars, htmlentities, utf8_decode / -encode oder einen anderen Zeichensatz (UTF-8 etc.) aus dem ² ein ganz anderes Zeichen oder HTML-Code macht ( ² = ² und ³ = ³ ). Was anderes kann ich mir im Moment leider nicht vorstellen.
 
Ja muss damit was zu tun haben weil wenn ich:

Code:
                $my2='+2x³++1x-+3=+0';
                $my2 = preg_replace('!([+-][\d\.]+[x²³]*)!','($1)',$my2);
mache. geht es. Das bedeutet durch die Eingabe vom User... wird die ² irgentwie anders dargestellt

Muss ich evtl was im Kopf meiner HTML Datei angeben ?
 
HTML:
<?xml version="1.0" encoding="UTF-8" ?>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Erste Zeile, je nachdem ob du XHTML-Dokumente hast oder nicht.
Auch statt UTF-8 die passende Codierung angeben. Was passiert denn mit dem String? Wie wird der übergeben? Wie verarbeitest du den noch innerhalb vom Script?
 
Die Angabe der Metadaten hat leider nichts gebracht:

ich habe zwei Dateien: eingabe.php

Code:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Termumformung</title>
<link rel="stylesheet" type="text/css" href="generatoren.css">
</head>
<body>
<?php
include_once("class/termneu.php");
include_once("class/zahlneu.php");

$meinterm = new termneu();
?>
<h2>Eingabe</h2>
    <form action='?' method='POST'>
        <input type='TEXT' name='eingabe' id='eingabe' size='100' value='<?php echo $_POST['eingabe'] ?>' />
        <input type='submit' value='Senden' />
    </form>
<?php
$meinterm->termneu($_POST['eingabe']);
?>
</body> 
</html>
und die Klasse an sich wo der Konstrutor so aussieht
Code:
#===  FUNCTION  ============================================================
    #         NAME:  termneu
    #      PURPOSE:  Veraendert den eingehenden String so das er fuer die Klasse
    #                berechenbar ist. Dabei werden um die Zahlen Klammern erzeugt
    #                und die dafuer stehenden Vorzeichen eingefuegt wenn nicht
    #                vorhanden.
    #   PARAMETERS:  $value:    String der umgeformt werden soll
    #      RETURNS:  Ergebnis der berechnung oder bei Fehlern die Fehlermeldung
    #  DESCRIPTION:  Veraendert den eingehenden String so das er fuer die Klasse
    #                berechenbar ist.
    #===========================================================================
    function termneu($value=0){
        if(strlen($value)==0)
            return "";
        else{
            //echo "eingang".$value;
            $klammerncounter=0;
            
            #-----------------------------------------------------------------------
            #  Ueberprueft ob die Unbekannte x vorkommt
            #-----------------------------------------------------------------------
            if(preg_match("![x]+!",$value)){
    
                #-----------------------------------------------------------------------
                #  Ueberprueft ob die Eingabe keine unerlaubten Buchstaben enthaelt
                #-----------------------------------------------------------------------
                if(preg_match("![a-wy-zA-WY-Z]+!",$value))
                    return "nur x als Unbekannte erlaubt";
    
                #-----------------------------------------------------------------------
                #  Ueberprueft ob Klammern vorkommen
                #-----------------------------------------------------------------------
                for($x=0;$x<strlen($value);$x++){
                    // ... wenn eine Klammer auf geht
                    if($value[$x]=='(')
                        return "Klammern sind nicht erlaubt";
                    // ... wenn eine Klammer zu geht
                    if($value[$x]==')')
                        return "Klammern sind nicht erlaubt";
                }
                // macht ein + vor der ersten Zahl wenn es nicht vorhanden ist
                $my2 = preg_replace("!^([\d]x?)!","+$1",$value);
                
                if($this->zwischenschritte)
                    echo "Nach Bearbeitung der ersten Stelle:\t".$my2."<br />";

                // macht eine 1 vor x wenn keine Zahl vor x steht
                $my2 = preg_replace("!(\+|\-)(x)!",'${1}1$2',$my2);
                
                if($this->zwischenschritte)
                    echo "Nach Bearbeitung, wenn +x dann +1x:\t".$my2."<br />";

                // wenn eine Zahl Klammern um sich stehen hat, werden diese
                // entfernt. Aus (+2.12) wird +2.12 
                $my2 = preg_replace("!\((\+|\-)([\d]+(\.[\d]+)?x?)\)!","$1$2",$my2);
                
                if($this->zwischenschritte)
                    echo "Nach s&auml;ubern von doppelten Klammern:\t".$my2."<br />";
                
                #-----------------------------------------------------------------------
                #  Fuegt Vorzeichen hinzu wie folgt
                #  Wenn Beispielsweise 41*21 im String steht wird daraus 41*+21
                #  Wenn Beispielsweise (41*21) im String steht wird daraus (+41*21)
                #  Wenn Beispielsweise (41*21)/6 im String steht wird daraus (+41*21)/+6
                #  Wenn Beispielsweise 41(41*21) im String steht wird daraus 41*(41*21)
                #  Wenn Beispielsweise 61=23+2x im String steht wird daraus 61=+23+2x
                #-----------------------------------------------------------------------
                for($x=0;$x<strlen($my2);$x++){
                    // ... wenn es sich um ein Gleichheitszeichen "=" handelt und diese nicht ganz
                    // vorne im String steht
                    //41(41*21)/61=<---23+2x
                    if( $x>0 && $my2[$x]=='=' ){
                        // ... wenn nach dem = Zeichen eine Zahl oder eine Unbekannte ist
                        if( $my2[$x+1]=='x' || in_array($my2[$x+1],$this->zahlen) ){
                            $mytemp=substr($my2,0,$x);
                            $mytemp.=$my2[$x]."+".substr($my2,$x+1);
                            $my2=$mytemp;
                            $mytemp=NULL;
                        }
                    }
                    // ... wenn es sich um ein Operator handelt und diese nicht ganz
                    // vorne im String steht
                    //41(41*<---x)/61
                    if( $x>0 && in_array($my2[$x],$this->operatoren) ){
                        // ... wenn die Zeichen drum herum Zahlen oder Unbekannte sind
                        if( (in_array($my2[$x-1],$this->zahlen) || $my2[$x-1]=='x' || $my2[$x-1]=='²' || $my2[$x-1]=='³') && ($my2[$x+1]=='x' || in_array($my2[$x+1],$this->zahlen)) ){
                            $mytemp=substr($my2,0,$x);
                            $mytemp.=$my2[$x]."+".substr($my2,$x+1);
                            $my2=$mytemp;
                            $mytemp=NULL;
                        }
                    }
                    // ... wenn es sich um eine Zahl handelt und diese nicht ganz
                    // vorne im String steht
                    //41(4<---1*21)/61
                    if( $x>0 && in_array($my2[$x],$this->zahlen) ){
                        // ... wenn vor dieser Zahl eine offene Klammer steht
                        if( $my2[$x-1]=='(' ){
                            $mytemp=substr($my2,0,$x);
                            $mytemp.="+".substr($my2,$x);
                            $my2=$mytemp;
                            $mytemp=NULL;
                        }
                    }
                    // ... wenn es sich um eine Zahl handelt und diese nicht ganz
                    // vorne im String steht 
                    //41(41*21)/6<---1
                    if( $x>0 && in_array($my2[$x],$this->zahlen) ){
                        // ... wenn ein Zeichen vor der Zahl ein Operator steht
                        // und davor eine geschlossene Klammer
                        if( in_array($my2[$x-1],$this->operatoren) && $my2[$x-2]==')' ){
                            $mytemp=substr($my2,0,$x);
                            $mytemp.="+".substr($my2,$x);
                            $my2=$mytemp;
                            $mytemp=NULL;
                        }
                    }
                    // ... wenn es sich um eine offene Klammer handelt und diese
                    // nicht ganz vorne im String steht
                    //41(<---41*21)/61
                    if( $x>0 && $my2[$x]=='(' ){
                        // ... wenn vor dieser offenen Klammer eine Zahl steht
                        if( in_array($my2[$x-1],$this->zahlen) || $my2[$x-1]=='x'){
                            $mytemp=substr($my2,0,$x);
                            $mytemp.="*".substr($my2,$x);
                            $my2=$mytemp;
                            $mytemp=NULL;
                        }
                    }
                    
                }
                
                //$my2 = preg_replace("!(\+|\-)?(x)!","$11$2",$my2);
                
                if($this->zwischenschritte)
                    echo "Nach Bearbeitung mit Vorzeichen:\t".$my2."<br />";
                
                // Jede alleinstehende Unbekannte bekommt eine Klammerung
                // Aus +x² wird (+1x²)
                //$my2 = preg_replace("!((\+|\-)(x(²|³)))!","(${2}1$3)",$my2);
                // Jede Zahl mit ein Vorzeichen bekommt eine Klammerung.
                // Aus + +41*(+41*+21)/+61 wird (+41)*((+41)*(+21))/(+61)
                //echo "reg Ausdruck !(\+|\-)([\d]+(\.[\d]+)?(x(²|³)?)?)!,($1$2$4)";
                //$my2='+2x³++1x-+3=+0';
                //echo "<br>vorhtmlentities".$my2;
                //$my2=html_entity_decode($my2);
                //echo "<br>nachhtmlentities".$my2;
                

                //$my2=html_entity_decode($my2);
                $my2 = preg_replace('!([+-][\d\.]+[x²³]*)!','($1)',$my2);
                
                if($this->zwischenschritte)
                    echo "Nach Bearbeitung mit klammern:\t".$my2."<br />";
                
                /*
                for($x=0;$x<strlen($my2);$x++){
                    if( $my2[$x]==')' && ($my2[$x+1]=='²' || $my2[$x+1]=='³') ){
                        echo "xxx";
                        if($my2[$x]=='²')
                            $my2[$x]=='²';
                        else
                            $my2[$x]=='³';
                        $my2[$x+1]==')';
                    }
                }
                
                if($this->zwischenschritte)
                    echo "Nach Bearbeitung mit klammern:\t".$my2."<br />";
                */
                for($x=0;$x<strlen($my2);$x++){
                    if($my2[$x]=='=')
                        $gleichheitszeichen++;
                }
                
                if($gleichheitszeichen==1){                        
                    // gibt den bearbeiteten String weiter an klammernausfloesen
                    return $this->klammernausfloesen($my2);
                }else
                    return "Dies ist kein g&uuml;ltiger Term";
            }
        }
    }
ganz unten seht der Teil den wir gerade diskutieren
 
Ich werde verrückt es lag doch an den Metadaten

Code:
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />

ist die Lösung.
Da fällt mir doch glatt ein Spruch dazu ein.

if(copy_paste()==0)
return"Programmieren hilflos";
else
return"Gehaltserhoehung";
;-)
 
Zurück