So, jetzt mein bisheriges Ergebnis, am besten in einen Editor mit Syntaxhighlighting kopieren
// Diese Funktion benütze ich gerne in Verbindung mit PREG_OFFSET_CAPTURE
function offsetArray($matches) {
$ret = array();
while (count($matches) > 0) {
$ret[] = array_reverse(array_shift($matches));
}
return $ret;
}
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$textMarker = array("_" => "u","*" => "b","/"=>"i");
$testStr = "wort _/wort1 *wo_rt2/ wort3* wort4_ wort";
echo htmlentities($testStr)."<br />";
foreach ($textMarker as $marker => $tag) {
$marker = "\".$marker;
$markers = "X|\".join("|\",array_keys($textMarker));
// Hier werden ersteinmal alle Marker durch ein XX-(START|END):(u|b|i)-XX ersetzt, da ich sonst Schwierigkeiten mit dem Slash bei den Schließenden Tags bekommen habe, aber das soll sich noch ändern.
preg_match_all("/(^|>|$markers|\s)$marker(.+)$marker(\s|$markers|<|$)/uU",$testStr,$matches,PREG_OFFSET_CAPTURE);
list($orig,$pre,$cont,$post) = offsetArray($matches);
foreach ($orig as $key => $foo) {
$cont[$key][0] = "XX-START:$tag-XX".join("XX-END:$tag-XX XX-START:$tag-XX",explode(" ",$cont[$key][0]))."XX-END:$tag-XX";
$testStr = substr_replace($testStr,$pre[$key][0].$cont[$key][0].$post[$key][0],$orig[$key][1],strlen($orig[$key][0]));
}
}
// Hier werden dann die eigentlichen Tags eingesetzt
$testStr = preg_replace("/XX-START:(u|b|i)-XX/","<\1>",$testStr);
$testStr = preg_replace("/XX-END:(u|b|i)-XX/","</\1>",$testStr);
echo htmlentities($testStr)."<br />";
// dieser Teil kommt mir so vor, als wenn man ihn verkürzen könnte, aber ich weiß im Moment nicht wie. Vielleicht einen Tip? Es werden alle Tags in die gleiche Reihenfolge gebracht. Vorher funktioniert das nicht, da im ersten Schritt die Tags immer um das Wort herumgeschrieben werden.
$testStr = preg_replace("/(<u><b><i>|<u><i><b>|<b><i><u>|<i><b><u>|<b><u><i>)/","<i><u><b>",$testStr);
$testStr = str_replace("<b><i>","<i><b>",$testStr);
$testStr = str_replace("<b><u>","<u><b>",$testStr);
$testStr = str_replace("<u><i>","<i><u>",$testStr);
$testStr = preg_replace("/(</u></b></i>|</u></i></b>|</b></i></u>|</i></b></u>|</i></u></b>)/","</b></u></i>",$testStr);
$testStr = str_replace("</i></b>","</b></i>",$testStr);
$testStr = str_replace("</u></b>","</b></u>",$testStr);
$testStr = str_replace("</i></u>","</u></i>",$testStr);
// Hier werden <x></x> Tags herausgeschnitten. Dazwischen darf beliebiger Whitespace sein.
foreach ($textMarker as $key => $elem) {
$testStr = preg_replace('/</'.$elem.'>(\s*)<'.$elem.'>/',"\1",$testStr);
echo htmlentities($testStr)."<br />";
}
echo htmlentities($testStr)."<br />";
echo $testStr."<br />";
Das einzige, was jetzt noch stört ist, daß zwischen den Unterstreichungen ein Leerzeichen ohne Unterstreichung ist. Aber das schaffe ich jetzt auch noch, nachdem ich mich seit einem Monat mit dem Gedanken an dieses Script plage.
Mein ergebenster Dank an dieses Forum, dies war eine der letzten Hürden zu meinem perfekten Content Management System.
Grüße
Heizer