Problem mit strtolower

flowerpower

Mitglied
Habe ein Verständnisproblem die Funktion strtolower betreffend. Warum wird nach Umwandlung aller Zeichen in Kleinbuchstaben keine Übereinstimmung mehr gefunden?
$string1 ist doch dann 'das das das das das das das'

Wenn ich auf $string prüfe erhalte ich wenigstens 3 Positionen.

PHP:
<?php

$offset = 0;
$find = 'das';
$find_length = strlen ($find);

$string = 'Das das Das das Das das Das';
$string1 = strtolower($string);

while ($string_position = strpos($string1, $find, $offset))
{
	echo $find. ' an Position ' . $string_position.' gefunden <br>';	
	$offset = $string_position + $find_length ;
}

?>

Danke und Gruß. flowerpower
 
Mit diesem Startwert für $offset

PHP:
$offset = 1;

bekommst du folgende Ausgabe:

Code:
das an Position 4 gefunden
das an Position 8 gefunden
das an Position 12 gefunden
das an Position 16 gefunden
das an Position 20 gefunden
das an Position 24 gefunden
 
Danke, soweit ok, aber ... warum ergibt $offset = 0 keine Ausgabe?
An Position 0 befindet sich ja auch ein 'das' - es sind somit doch eher 7 'das' und nicht nur 6.

... kann eine Übereinstimmung an der 0. Position nicht gefunden werden?
 
Zuletzt bearbeitet:
Habe selbst eine Lösung gefunden. Eine Übereinstimmung an Position 0 kann nicht ohne Weiteres gefunden werden, da 0 als false interpretiert wird.

Abhilfe kann man mit einem kleinen Zusatz schaffen (etwas abgewandelt):
PHP:
<?php

$offset = 1;
$find = 'a';
$find_length = strlen ($find);

$string = strtolower('abc abc abc abc');

$spos=strpos($string, $find);
if (is_int($spos)&&($spos==0)) 
{
	echo $find . " an Position $spos gefunden <br>";
}

while ($string_position = strpos($string, $find, $offset))
{
	echo $find. " an Position $string_position gefunden <br>";	
	$offset = $string_position + $find_length;
}

?>

Ausgabe:

Code:
a an Position 0 gefunden 
a an Position 4 gefunden 
a an Position 8 gefunden 
a an Position 12 gefunden
 
Zuletzt bearbeitet:
PHP:
if (is_int($spos)&&($spos==0)) 
{
    echo $find . " an Position $spos gefunden <br>";
}

Das ist unnötiger Overhead, dafür gibt es den Identitätsvergleich, dieser ist nur bei gleichem Typ und Wert true. Das 0 als false interpretiert wird, liegt an dem dynamischen Typsystem von PHP.

PHP:
if ($spos === 0) 
{
    echo $find . " an Position $spos gefunden <br>";
}
 
Das steht aber auch groß, rot und teilweise auch noch fett in der Doku zu strpos.
This function may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE, such as 0 or "". Please read the section on Booleans for more information. Use the === operator for testing the return value of this function.

Demzufolge kannst du dir das if auch völlig sparen:
PHP:
while (($string_position = strpos($string, $find, $offset)) !== false)
 
... soweit war ich noch nicht, hatte mich erst einmal mit meiner Lösung begnügt.
PHP:
while (($string_position = strpos($string, $find, $offset)) !== false)
... ist natürlich eleganter.

Danke und Gruß.
 
Zurück