preg_replace funktioniert leider nicht

quidnovi

Erfahrenes Mitglied
hi @ all

mit folgenden code ist es mir unmöglich, umlaute zu ersetzen:
PHP:
session_start();



echo "<p />".$_POST['auftrag']." - original eingabe <p />";
	  $sonderzeichen = Array("/ä/","/ö/","/ü/","/Ä/","/Ö/","/Ü/","/ß/","/y/");
	  $ersetzen = Array("ae","oe","ue","Ae","Oe","Ue","ss","Y");
	  $_POST['auftrag'] = preg_replace($sonderzeichen, $ersetzen,$_POST['auftrag']);

	  echo $_POST['auftrag']." - die abgeaenderte eingabe<br />";die();

wie ersichtlich, übergebe ich die daten per $_POST an das script "check_data.php".

das faszinierende daran ist, dass das "y" sehr wohl ersetzt wird, die umlaute aber nicht.

lass mir das array $_POST mit:
PHP:
echo nl2br(print_r($_POST,true));
ausgeben. nun sieht das folgendermaßen aus:
Code:
Array
(
[auftrag] => y___ÄäÜüÖö
[job] => 
[stk] => 
[breite] => 
[hoehe] => 
[dirIndir] => direkt
[farbe] => cmyk
[medium] => Banner
)

y___ÄäÜüÖö - original eingabe 

Y___ÄäÜüÖö - die abgeaenderte eingabe


habe ausserhalb des projektes eine test.php, in welcher folgender code steht:
PHP:
$txt = "y___ÄäÜüÖö";
	echo $txt." - original<p />";
	$sonderzeichen = Array("/ä/","/ö/","/ü/","/Ä/","/Ö/","/Ü/","/ß/","/y/");
	$ersetzen = Array("ae","oe","ue","Ae","Oe","Ue","ss","Y");
	$txt = preg_replace($sonderzeichen, $ersetzen, $txt);
	echo $txt." - nur umlaute ersetzt<p />"; die();

bei aufruf bekomme ich folgendes:
Code:
y___ÄäÜüÖö - original
Y___AeaeUeueOeoe - nur umlaute ersetzt

hier wird alles anstandslos umgewandelt. also habe ich im original script irgendwo einen ziemlichen wurm drin, den ich leider nicht finde.


was übersehe ich da? könnt ihr mir bitte helfen? danke
 
Zuletzt bearbeitet:
Eventuell besteht deine Eingabe aus einem anderen Zeichensatz als deine interne Eingabe. Du solltest also vor dem Ersetzen überprüfen ob eine Konvertierung nötig ist, oder grundsätzlich in einen anderen Zeichensatz konvertieren. ([phpf]iconv[/phpf], [phpf]utf8_encode[/phpf], ...) Des Weiteren solltest du deinen Editor entsprechend so konfigurieren, dass der gewünschte Zeichensatz verwendet wird. Ist die Eingabe in UTF-8, und deine hart-codierten Sonderzeichen im Quelltext beispielsweise Windows-1252, ist die internete Repräsentation eines Zeichens für gleiche Präsentation doch unterschiedlich.

Sofern du keine regulären Ausdrücke zum Ersetzen verwendest, ist es übrigens effizienter auf ein einfaches [phpf]str_replace[/phpf] zurückzugreifen.

Eine Lösung, die in deinem Fall mit preg arbeitet, ist meiner Meinung nach lediglich mit Callback sinnvoll:
PHP:
preg_replace_callback(
		'%[\196\214\220\228\246\252]%s',
		create_function(
				'$m',
				'switch (ord($m[ 1 ])) {' .
				'	default:  return $m[ 1 ];' .
				'	case 196: return \'Ae\';' .
				'	case 214: return \'Oe\';' .
				'	case 220: return \'Ue\';' .
				'	case 228: return \'ae\';' .
				'	case 246: return \'oe\';' .
				'	case 252: return \'ue\';' .
				'}'
			)
	);

Über Sinn und Unsinn kann man sich hier natürlich streiten... ;)
 
danke vorerst maeTimmae...


ich habe mit der codierung mist gebaut und weiß jetzt nicht welchen. gehe mal auf die suche. werde hoffentlich einen weg finden, die eingaben zu synchronisieren.

habe ja in beiden browsern (firefox und ie) die umlautdarstellung vom lokalen server kryptisch...:mad:


werde mich aber sicher in bälde wieder melden, ob mit oder ohne lösung...:)


äähhh...wenn sich nun jemand hier findet, der mir einen schubs in die richtige richtung gibt, dann würde die sonne wieder heller strahlen...:-)
 
Zuletzt bearbeitet:
Zurück