Om spam te voorkomen gebruik ik in een mailform oa deze code


} elseif(!preg_match("/^[A-Za-z0-9-_.+%]/", $_POST['bericht'])){ 
    echo ' Geen vreemde tekens in je bericht aub.<br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>'; 


Vreemd genoeg worden letters met een accent (zoals é è à) en accenten ook tegengehouden. Maar wat blijkt: deze letters met een accent worden omgezet in à (hoofdletter A en een tilde).

Hoe kan ik er voor zorgen dat de letters met een accent wel toegelaten worden, maar de à niet?
Let er wel op, zoals eerder door iemand opgemerkt, dat die reguliere uitdrukking slechts naar het eerste teken kijkt. Er mist een "+$" na de "]"
@ Ivo P

Dat dacht ik net in de gauwigheid ook al te zien, maar ervan uitgaande dat het gewerkt heeft en ik niet heel veel tijd had om ernaar te kijken, had ik er (nog) geen opmerking over gemaakt. Maar volgens mij heb je gelijk. Dan zou het dus moeten worden:

<?php
} elseif(!preg_match("/^[A-Za-z0-9-_.+%]+/u", $_POST['bericht'])){
?>
Volgens mij gaat dat nog steeds niet werken, omdat [a-z] ook met een unicode-modifier niet matcht op bijvoorbeeld ä. Beter kun je in de regex gebruik maken van character types:

<?php
} elseif(!preg_match("/^[-\w\s.+%]+$/u", $_POST['bericht'])){
?>

De \w matcht hoofd- en kleine letters, cijfers en de underscore. En wat letters betreft ook de versies met accentjes, als je de u-modifier gebruikt.

Let wel op dat je de - meteen na de [ of meteen voor de ] zet, omdat PCRE anders zou kunnen denken dat het een range indicator is.

Ander puntje: je wilt de gehele input matchen, dus je regex moet eindigen met een $. Doe je dat niet, dan test 'ie alleen de input tot aan het eerste teken dat niet gematcht wordt. In de praktijk betekent dat, dat als het eerste teken van je input geldig is, de regex 'true' zal teruggeven. En omdat je waarschijnlijk ook wel berichten van meer dan 1 woord wilt toestaan, heb ik een \s (whitespace) aan de regex toegevoegd.

Maar, zoals al eerder is opgemerkt: reacties met komma's, dubbele punten, aanhalingstekens, haakjes of andere redelijk normale tekens worden nog steeds geweigerd.
Goede toevoeging Willem!
Ozzie PHP op 25/06/2021 12:32:29

Je zegt:

1) Vreemd genoeg worden letters met een accent (zoals é è à) en accenten ook tegengehouden.

2) Maar wat blijkt: deze letters met een accent worden omgezet in à (hoofdletter A en een tilde).

Eerst zeg je dat ze worden tegengehouden. Maar vervolgens worden ze omgezet? Dat klinkt niet heel logisch. Iets kan niet worden omgezet als het even daarvoor is tegengehouden.

Dus ... leg eens even duidelijk uit wat er precies gebeurt.


Het is eerder omgekeerd denk ik. Eerst zal alles met een accent omgezet worden naar die à en vervolgens wordt dat tegengehouden.

In ieder geval: al jullie voorstellen helpen helaas niet:
} elseif(!preg_match("/^[A-Za-z0-9-_.+%]/", $_POST['bericht'])){
} elseif(!preg_match("/^[A-Za-z0-9-_.+%]/u", $_POST['bericht'])){
} elseif(!preg_match("/^[A-Za-z0-9-_.+%]+/u", $_POST['bericht'])){
} elseif(!preg_match("/^[-\w\s.+%]+$/u", $_POST['bericht'])){

Als test typ ik deze zin: éèà´` dit is een test
Als alert krijg ik: geen vreemde tekens in jouw bericht aub.

Het is dus de bedoeling dat letters met een accent wel mogen. Maar niet het finaal omgezet teken zoals Ã.
>> Eerst zal alles met een accent omgezet worden naar die Ã

Dat kun je gewoon testen. Zet voor het if-statement:

<?php

echo '<br><br>BERICHT:<br><br>';
echo $_POST['bericht'] . '<br><br>';

?>

Wat staat er trouwens in de 'if' die boven de elseif staat?
G P op 25/06/2021 17:00:17

Als test typ ik deze zin: éèà´` dit is een test
Als alert krijg ik: geen vreemde tekens in jouw bericht aub.

Het is dus de bedoeling dat letters met een accent wel mogen. Maar niet het finaal omgezet teken zoals Ã.

Tsja, als je ´ en/of ` in je input hebt staan, zal je regex inderdaad niet matchen. Een los accentteken is iets anders dan een letter met accent en moet dus ook afzonderlijk gematcht worden.
Ozzie PHP op 25/06/2021 17:12:12

Wat staat er trouwens in de 'if' die boven de elseif staat?



<?php
//naam
if(!strlen($_POST['voornaam'])) { 
    echo ' Gelieve uw naam in te vullen.<br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>'; 
} elseif(strlen($_POST['voornaam']) < 2) { 
    echo ' Gelieve uw volledige naam in te vullen.<br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>'; 	
} elseif(preg_match("/http/", $_POST['voornaam'])) {   
    echo ' Het naamveld mag geen link bevatten.<br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>'; 
} elseif(preg_match("/www/", $_POST['voornaam'])) {   
    echo ' Het naamveld mag geen link bevatten.<br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>'; 
//email				
} elseif(!strlen($_POST['emailadres'])) { 
    echo ' Gelieve uw emailadres in te vullen.<br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>'; 	
} elseif(!preg_match("/.+@[a-zA-Z0-9_-]+..+/", $_POST['emailadres'])) {  
    echo ' U hebt geen geldig emailadres ingevuld.<br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>';
//telefoon	
} elseif(preg_match("/tel/", $_POST['telefoon'])) {   
    echo ' Het telefoonnummer mag geen letters bevatten.<br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>'; 	
} elseif(preg_match("/http/", $_POST['telefoon'])) {   
    echo ' Het telefoonveld mag geen link bevatten.<br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>'; 		
} elseif(preg_match("/www/", $_POST['telefoon'])) {   
    echo ' Het telefoonveld mag geen link bevatten.<br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>'; 
//onderwerp						 		
} elseif(!strlen($_POST['onderwerp'])) { 
    echo ' Gelieve een onderwerp in te vullen. <br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>';	
} elseif(preg_match("/http/", $_POST['onderwerp'])) {   
    echo ' Er mogen geen links aangebracht worden in het onderwerp.<br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>'; 
} elseif(preg_match("/www/", $_POST['onderwerp'])) {   
    echo ' Er mogen geen links aangebracht worden in het onderwerp.<br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>'; 						 		
} elseif(!strlen($_POST['bericht'])) { 
    echo ' Gelieve een bericht te schrijven. <br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>';	
} elseif(preg_match("/http/", $_POST['bericht'])) {   
    echo ' Er mogen geen links aangebracht worden in het bericht.<br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>'; 
} elseif(preg_match("/www/", $_POST['bericht'])) {   
    echo ' Er mogen geen links aangebracht worden in het bericht.<br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>'; 
} elseif(strlen($_POST['bericht']) < 50) {
    echo ' Gelieve uw bericht een beetje te onderbouwen.<br>Minimum 50 karakters aub.<br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>';	
} elseif(!preg_match("/^[-\w\s.+%]+$/u", $_POST['bericht'])){
    echo ' Geen vreemde tekens in je bericht aub<br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>'; 	
//captcha	
} elseif(preg_match("/www/", $_POST['bericht'])) {   
    echo ' Er mogen geen links aangebracht worden in het anti-spamveld.<br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>';						
} elseif(!empty($_POST['antispam'])) { 
    echo ' Gelieve het anti-spamveld leeg te maken aub. <br><br>'; 
    echo '<a href="javascript:history.back(1);">Terug</a><br><br>';		
		                                 	
}       
 else 
{


$voornaam=$_POST['voornaam'];
$emailadres=$_POST['emailadres'];
$telefoon=$_POST['telefoon'];
$onderwerp=$_POST['onderwerp'];
$bericht=$_POST['bericht'];
$CAPTCHA=$_POST['CAPTCHA'];
?>


Opmerking van Willem gelezen?
Willem vp op 25/06/2021 17:15:25

Tsja, als je ´ en/of ` in je input hebt staan, zal je regex inderdaad niet matchen. Een los accentteken is iets anders dan een letter met accent en moet dus ook afzonderlijk gematcht worden.


Die afzonderlijke ´of `zijn toch accenten die gebruikt worden bij bv 's morgens?

Reageren