problem mit cString::iReplaceOnceReverse

Alle bestätigten Fehler in CONTENIDO 4.10 (erledigte Fehler werden durch geschlossene Beiträge gekennzeichnet).
Antworten
emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

problem mit cString::iReplaceOnceReverse

Beitrag von emergence » Mi 7. Feb 2024, 14:38

hmm... hatte jetzt den merkwürdigen fall das in der

includes.con_editcontent.php wo dieses cString::iReplaceOnceReverse

eingesetzt wird den fall, dass der code der vor </body> gesetzt werden soll folgendes generiert hat

Code: Alles auswählen

</bo<form name="editcontent" method="post" action="https://XXX.XXX.XX/contenido/external/backendedit/front_content.php?contenido=15f39f1a876b7ed255eb3472ff1939e6&area=con_editcontent&idart=327&idcat=8&lang=1&client=1"><input name="action" type="hidden" value="20"><input name="changeview" type="hidden" value="edit"><input name="idArtLangVersion" type="hidden" value=""><input name="copyTo" type="hidden" value=""><input name="data" type="hidden" value=""></form>
</body>tml>
habs derzeit mit einem str_replace workaround behoben...
wenn das eintritt kann man nicht in den tiny wechseln oder speichern... eh cool...

aber wenn ich mir die beiden funktionen der klasse ansehe stimmt irgendwas daran nicht...

Code: Alles auswählen

$code = cString::iReplaceOnceReverse("</body>", "$contentForms</body>", $code);
entweder verzählt sich das teil irgendwo oder durch die toLowerCase krachts...

Code: Alles auswählen

    public static function iReplaceOnceReverse($find, $replace, $subject) {
        $start = self::posReverse(parent::toLowerCase($subject), parent::toLowerCase($find));

        if ($start === false) {
            return $subject;
        }

        $end = $start + parent::getStringLength($find);

        $first = parent::getPartOfString($subject, 0, $start);
        $last = parent::getPartOfString($subject, $end, parent::getStringLength($subject) - $end);

        $result = $first . $replace . $last;

        return $result;
    }
    
    public static function posReverse($haystack, $needle, $start = 0) {
        $tempPos = parent::findFirstPos($haystack, $needle, $start);

        if ($tempPos === false) {
            if ($start == 0) {
                // Needle not in string at all
                return false;
            } else {
                // No more occurances found
                return $start - parent::getStringLength($needle);
            }
        } else {
            // Find the next occurance
            return self::posReverse($haystack, $needle, $tempPos + parent::getStringLength($needle));
        }
    }
    
mit folgendem code habe ich das selbe problem

Code: Alles auswählen

$code = cString::iReplaceOnce("</body>", "$contentForms</body>", $code);

Code: Alles auswählen

    public static function iReplaceOnce($find, $replace, $subject) {
        $start = parent::findFirstPos(parent::toLowerCase($subject), parent::toLowerCase($find));

        if ($start === false) {
            return $subject;
        }

        $end = $start + parent::getStringLength($find);
        $first = parent::getPartOfString($subject, 0, $start);
        $last = parent::getPartOfString($subject, $end, parent::getStringLength($subject) - $end);

        $result = $first . $replace . $last;

        return $result;
    }
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Re: problem mit cString::iReplaceOnceReverse

Beitrag von emergence » Do 8. Feb 2024, 08:26

je länger ich mir das ansehe desto mehr tut mir der fehler weh...
je nach codierung liefert mb_strlen unterschiedliche längen... autsch...
kurz gesagt, das darf man so nicht machen...

die funktion(en) muss/müssen das zeichensatz neutral hinbekommen... das reicht leider weit tiefer ins system wie ich mir das wünschen würde...

machma mal was schönes...

folgendes ersetzt folgende 3 funktionen in class.string.php

public static function iReplaceOnce
public static function iReplaceOnceReverse
public static function posReverse

ist schneller und zeichensatz neutral

Code: Alles auswählen

    public static function iReplaceOnce($find, $replace, $subject) {

        // only the first found in $subject
        return preg_replace('/'.preg_quote($find, '/').'/is', str_replace('\\', '\\\\', $replace), $subject, 1); 

    }

    public static function iReplaceOnceReverse($find, $replace, $subject) {

        // only the last found in $subject
        return preg_replace('/'.preg_quote($find, '/').'(?!.*'.preg_quote($find, '/').')/is', str_replace('\\', '\\\\', $replace), $subject);

    }
*** make your own tools (wishlist :: thx)

Antworten