• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Regular Expression mit preg_replace (another day in paradise)

vincentVirgile

New member
Wiedermal Regex... :p
Ich versuche in ein text alles zu ersetzen ausser meine tags... sollte eigentlich einfach funktionieren ;-)
nun immer wieder treffe ich auf dasselbe problem :(
also hilfeeee... :grin:

ich möchte alle spezielle charactere ausser meiner tags ersetzen... nun alle meine tags werden ersetzt ausser das was ich wille...
PHP:
    $strInput = "<b>Hello World</b><i>öm, hällö welt</i>blah blah, ö, ä, ü, sch**ße usw." ;
    $rgx = "[^<.*>]" ;
    print(preg_replace($rgx, htmlspecialchars($strInput, ENT_QUOTES, $charset), $strInput));
 
Befinde mich im falschen berreich... hmmm, kann jemanden mein post in den richtigen berreich unterbringen?

wenn ich klar utf-8 formatierung verwende kommt alles gut durch... auser das die HTML charctere noch immer geändert werden!
ah ja... vielleicht hat irgendjemanden eine gute idee...
kkaspnerrrrrrrrrr :p du kennst dich ja gut aus, was mache ich falsch?
ausser zu wenig regex studieren :)

ich habe allerdings auch gesehen das ich htmlentities verwenden muss für deutsche charcters... scheint besser zu laufen.
nur fehlt mich jetzt noch der regex :p
 
Zuletzt bearbeitet:
Regular Expression problem

Hallo an allen,

Technologie: php
Thema: regular expressions

Ich möchte alles in einem text ersetzen durch html_entities, auser meine HTML tags...
meine meinung nach sollte das funktionieren über ein reguläre ausdruck...
es gibt ja viele methoden, sowie das wieder umwanderen von entities...

Die situation:

PHP:
    //abgespeckte version um das problem besser betrachten zu können
    $strInput = "<b>Hello World</b><i>öm, hällö welt</i>blah blah, ö, ä, ü, sch**ße usw." ;	

    $rgx = "/[^<.*>]/" ; //scheint nicht zu funktionieren
    $strInput = preg_replace($rgx, htmlentities($strInput, ENT_QUOTES, "UTF-8") , $strInput);

1. ich dachte das /[^foo]/ bedeutet --> alle treffer, auser foo
2. /<.*>/ --> alles was zwischen < oder > steht
3. alles was nicht 1,2 ist bzw. /[^<.*>]/

Das Ziel ist also, alles in einem string als HTML entities zu übersetzen, mit ausnahme von meine Tags! Ich weiß man konnte es mit zuruckwanderfunktionen usw. lösen, aber das ist hässlich... ich stehe ein bischen auf estethik :p

was mache ich falsch, ausser zu wenig regex zu studieren :p
Kkaspnerrrrrrrr, du bist ja so ein regex meister, was stimmt nicht an meinem vorhaben?

Liebe grüßen an allen und vielen dank...

:grin:
 
First: @Superadmin: Bitter verschieben!

Second: Du kannst alles mit htmlentities() umwandeln und dann < bzw > wieder in < bzw. > umwandeln.

Also so:

PHP:
<?php 
echo preg_replace(
        array('/\&lt\;/', '/\&gt\;/'),
        array('<', '>'),
        htmlentities('<b>asdfÜAAÄasdf</b>')
    );
?>

Hoffe ich konnte helfen...
 
HTML 4 YOUs Ansatz ist jetzt nicht schlecht. Ich hab' aber trotzdem mal was geschrieben, wie man das mit einem RegExp-Filter machen kann:
PHP:
function noTagReplace($match){
	if (preg_match("/^<[^>]+>$/", $match[0])) return $match[0];
	return htmlentities($match[0], ENT_QUOTES, "UTF-8");
}

echo preg_replace_callback("/<[^>]+>|[^<>]+/", "noTagReplace", "<b>Hello World</b><i>öm, hällö welt</i>blah blah, ö, ä, ü, sch**ße usw.");

EDIT: Die RegExp in der Funktion kann man natürlich auch weglassen und einfach das erste Zeichen auf Identität mit < prüfen:
PHP:
	if ($match[0]{0} == "<") return $match[0];
 
Zuletzt bearbeitet:
Hallo,
vielen dank erstmal an allen für die mühe... jetzt noch eine kleine frage dazu:
wenn ich in mein noTagReplace die eine zweite parameter hinzufügen möchte bzw. charset
wie rufe ich die dan an aus meine callback function... ist mir nicht so klar.

zb.

PHP:
function noTagReplace($match, $charset){
    if (preg_match("/^<[^>]+>$/", $match[0])) return $match[0];
    return htmlentities($match[0], ENT_QUOTES, $charset);
}
// "noTagReplace" ergibt standard $match, nun wie kann ich jetzt noch die zweite parameter bekannt machen?
echo preg_replace_callback("/<[^>]+>|[^<>]+/", "noTagReplace", "<b>Hello World</b><i>öm, hällö welt</i>blah blah, ö, ä, ü, sch**ße usw.");
 
nochmals vielen vielen dank... und :p
ich habe mich angefreundet mit die methode von HTML4you, ich fand sie am einfachsten.
habe dazu noch die quotes und die ampersanten wiedergesetzt um alles wieder zum normalen zu führen.
jetzt, bin ich trotzdem neugierig wie das mit multiple parameter geht für eine callback function :)

letztendlich ist habe ich diese funktion geschrieben mit euere hilfe:


PHP:
	public function normalizeCharacterSet($strInput){
	     return  preg_replace(
        	array("/\&lt\;/", "/\&gt\;/", "/\&quot\;/", "/\&amp\;/"),
       		array("<", ">", "\"", "&"),
       		htmlentities($strInput, ENT_QUOTES, $this->charset) 
	     ); 
	}

vielen lieben dank,

Vincent
 
Zuletzt bearbeitet:
Zurück
Oben