Hallo,

Ik wil graag het aantal domeinen tellen in een tekst. In het onderstaande voorbeeld zijn dit 2 stuks.
Echter, de telling werkt niet, blijft op 1 staan. En als ik $i = 0; boven de foreach zet, tel hij alle items (6), terwijl het de bedoeling is dat hij alleen telt als aan de if voldaan wordt (2x).
Wat doe ik fout?


$value = "hallo google.nl hallo hallo www.bing.com hallo";
$array = explode(' ', $value);	
foreach ( $array as $str ) {
	$i = 0;
	if ( filter_var($str, FILTER_VALIDATE_DOMAIN) !== NULL ) {
		$i++;
	}
}	
https://ibb.co/6tQLgNW

Print is met m'n iPhone gemaakt. Zoals je bovenaan ziet is de site ook nog steeds via onveilige verbinding te bezoeken.

Guido
Die heeft nooit in de snel reageren textarea gestaan. Enkel op de losse reply pagina en die voor een nieuw topic. Misschien is het wel praktisch om toe te voegen.
Die SSL zal ik eens naar kijken.

Maar zulke dingen graag in het juiste forum. :-)
https://www.php.net/filter_var


Returns the filtered data, or false if the filter fails.


Jij zegt:
<?php
if ( filter_var($str, FILTER_VALIDATE_DOMAIN) !== NULL ) {
$i++;
}
?>

filter_var zal hier nooit null opleveren. hij geeft een string terug die een domain is OF hij geeft FALSE terug.

Vervang NULL door FALSE en je bent er.
Vervang NULL door FALSE en je bent er.


Had ik al gedaan maar werkte ook niet.

Guido
Ik heb dat ook al achterwege gelaten, maar ik heb het idee dat een reg-ex betrouwbaarder is.
Is dit niet ongeveer wat je zoekt? Je kan het natuurlijk nog helemaal aanpassen:


<?php
$value = "hallo google.nl hallo hallo www.bing.com hallo";
$array = explode(' ', $value);

$i = 0;

// Lijst van geldige extensies
$geldige_extensies = ['com', 'nl', 'org', 'net']; // Voeg hier alle gewenste extensies toe

foreach ($array as $str) {
    // Controleer of het woord lijkt op een geldig domein met een geldige extensie
    if (preg_match('/\b(?:www\.)?[a-zA-Z0-9-]+\.(' . implode('|', $geldige_extensies) . ')\b/', $str)) {
        $i++;
    }
}

echo "Aantal domeinen: " . $i;
?>
Thanks! Ik ga een regex gebruiken ipv FILTER_VALIDATE_DOMAIN, want dat lijkt niet goed te werken binnen een foreach.

Guido
de ellende met zo'n regex is dat je wel even wat moeilijker zijn dan bovenstaande.

ten eerste de steeds uitbreidende lijst van tlds
maar ook houdt deze geen rekening met subdomeinen.

forum.phphulp.nl komt er niet doorheen.
net als namen met andere letters dan a-z köln.de bijvoorbeeld

<?php
$value = "hallo google.nl hallo hallo www.bing.com hallo sub.voorbeeld.nl sub.example.com vöörbeeld.nl ïvoorbeeld.nl";
$array = explode(' ', $value);

$i = 0;

// Lijst van geldige extensies
$geldige_extensies = ['com', 'nl', 'org', 'net', 'at']; // Voeg hier alle gewenste extensies toe

foreach ($array as $str) {
    // Controleer of het woord lijkt op een geldig domein met een geldige extensie
    if (preg_match('/\b(?:[a-zA-Z0-9-]+\.)?[a-zA-Z0-9-\p{L}]+\.(' . implode('|', $geldige_extensies) . ')\b/u', $str)) {
        $i++;
    }
}

echo "Aantal domeinen: " . $i;
?>


Hier werken de subdomeinen en tekens als ö en ï wel

Reageren