$output wordt in elke iteratie van de foreach overschreven. Dus buiten de foreach krijgt deze altijd de laatste waarde. Verder behandel je in je voorbeeld dat $output als een array, maar het is gewoon een string.
Maar bedoel je dus dat ik de overige waarden niet buiten de foreach kan aanroepen?
Kun je me uitleggen hoe ik de $output naar een array kan "omzetten"?
Kun je me uitleggen hoe ik de $output naar een array kan "omzetten"?
Maar je oorspronkelijke $array is toch al een array? :/
Waarom zou je een nieuw array bakken?
Wil alle backslashes dus strippen middels de foreach en de $output gebruiken voor de value van mijn input velden. Hoopte het bv zo te kunnen doen
Wat wil je hier uiteindelijk mee bereiken? Het aanpassen van input is zelden tot nooit de oplossing.
Als iets aan een bepaalde vorm dient te voldoen controleer je dit in de validatie van het formulier, maar je past de
invoer bij voorkeur niet aan. Voldoet de invoer niet aan je eisen geef je deze terug aan de gebruiker (zoals ie die aanleverde) met de mededeling dat de invoer gefixt moet worden.
Als je wilt voorkomen dat er HTML ingevoerd kan worden / het formulier wordt gebroken door speciale karakters dan kun je je beter bedienen van output escaping met functies zoals htmlspecialchars().
Maar eerst is het handig als je vertelt wat je nu eigenlijk probeert te bereiken :p.
Onderneem je met die bovenstaande preg_replace() een poging om invoer veilig(er) te maken? Dan zijn er andere en waarschijnlijk betere manieren om dit te doen.
In de mail die ik krijg staat een backslash achter (dubbele) aanhalingstekens en die wil ik eruit halen. Dus als iemand "Guido's" heeft ingetypt wordt het in het formulier als "Guido\'s" afgedrukt. Hetzelfde gebeurt in het formulier op mijn website, na drukken op submit. Mijn ervaring was dat stripslashes() niet altijd alle backslashes weghaalt dus vandaar deze poging. Misschien wat te veel vh goede?
Ehhh, dan zou ik uitzoeken waar dat vandaan komt dan.
Er schieten mij twee dingen te binnen die aan de hand kunnen zijn, en beide zijn onwenselijk:
- de PHP versie waar deze functionaliteit op draait is ouder dan versie 5.4, voor deze versie bestond er namelijk iets dat magic_quotes heette, dit voegde automagisch backslashes toe aan quotes. Dit werd vaak verkeerd gebruikt voor security redenen en was daar eigenlijk ook nooit voor bedoeld
- er is een of andere functie actief die in eerste instantie de backslashes toevoegt, waarschijnlijk met gebruikmaking van addslashes() of wellicht een real_escape_string() functie? De eerste is niet echt nodig voor een e-mail en de tweede is de verkeerde plek (context) om die functie te gebruiken
- EDIT: en mogelijk nog een derde: mogelijk kwamen deze tekstpassages met teveel slashes uit de database, waar ze in eerste instantie met extra slashes waren opgeslagen? ook dit principe (het op voorhand escapen, of ook wel escape-on-input) is vrijwel nooit een goed idee
Je moet het zo zien: in bepaalde contexten (HTML, SQL et cetera) zijn er bepaalde karakters die een bepaalde betekenis hebben. Zo heb je in HTML bijvoorbeeld de < punthaken >, de ampersand (&) en " dubbele quotes ". Om deze karakters onschadelijk te maken zijn er functies die deze karakters ontdoet van hun speciale betekenis binnen die context. Dit wordt ook wel output escaping genoemd.
Het klinkt alsof je deze methodiek aan moet wenden om je probleem op te lossen en ook loont het waarschijnlijk de moeite om de verschillende verkeerde manieren om output te escapen (zoals het sec toevoegen van backslashes) uit je applicatie te verwijderen.
stripslashes() bestrijdt alleen maar het symptoon van "teveel backslashes", het is beter om de achterliggende oorzaak die voor de overvloed aan backslashes zorgt te identificeren en weg te nemen. Waarschijnlijk komen er tijdens het identificatieproces nog wel wat andere skeletten uit de kast vallen :).
De achterliggende oorzaak is helaas simpel.. dit doet WordPress bij $_POST.. blijkbaar zelfs anno 2018 nog. Escapen doe ik al. Maar omdat mijn vraag daar niet over ging, heb ik dat achterwege gelaten in mijn voorbeeld ;-)
Weet je, ik laat de hele foreach anders maar achterwege en gebruik striplashes() na escapen.
Of andersom, eerst striplashes() en dan pas escapen?
Dat filter ken ik inderdaad maar ik wou het dus op een andere manier doen. Vandaar dat ik dit topic gestart was. Maar ik ben nu door jullie tot de conclusie gekomen dat mijn manier veels te omslachtig is dus zal nu inderdaad een PHP of native WordPress filter gaan gebruiken.