[Gelöst] Prüfen ob String ein festgelegtes Zeichen enthält

CreamyCewie

Photoshop-Künstler
Hi.

Wie kann ich mit PHP prüfen ob eine Varriable (string) z.B. ein "@" enthält?

Geht das iwie mit "Issset" ?

Danke & LG

Creamy
 
Das wäre jetzt meine Variante. Es prüft auch nicht nur das Vorhandensein, sondern zählt auch das Zeichen. Die Ausgabe ganz unten kann natürlich rein des Zählens wegen weggelassen werden.

PHP:
<?php
$text="blahfasel@";
$suche="@";
$vorhanden=0;

for ($i=0;$i<=strlen($text);$i++){
	if ($text[$i]==$suche){
		$vorhanden++;
	}
}

if ($vorhanden>=1){
	echo "Das Zeichen '",$suche,"' ist ",$vorhanden,"x enthalten!.";
	}
else {
	echo "Das Zeichen '",$suche,"' ist nicht enthalten!.";
	} 
?>
 
Mir ist noch etwas eingefallen.

Je nach Länge des zu prüfenden Textes wäre es Blödsinn, wenn Du nur ein einziges Exemplar dieses Zeichens finden willst, aber dann hinterher noch immer der ganze Katalog abgesucht wird. Daher kannst Du in der Schleife noch eine Unterbrechung einfügen. In diesem Fall kann aber dann nicht mehr die Anzahl gezählt sondern nur noch die Existenz eines Exemplars ermittelt werden.

PHP:
<?php 
$text="blahfasel@"; 
$suche="@"; 
$vorhanden=0; 

for ($i=0;$i<=strlen($text) && $vorhanden==0;$i++){ 
    if ($text[$i]==$suche){ 
        $vorhanden=1; 
    } 
}
?>
 
Zuletzt bearbeitet:
Hui :)

Joa so hab ich auch mal gearbeitet. Mittlerweile würd ich das so lösen:

PHP:
$string  = 'Dein Text mit einem @';
$pattern = '#[@]#';

if( preg_match($pattern, $string) ) {
    // Treffer
}

Woltest du anhand des @auf eine (valide) Emailadresse prüfen, macht man das aber anders. Generell würd ich dann mehr auf PHP: preg_match - Manual setzen denn auf strlen, strpos und ähnliche, vor allem weil eine RegEx heutzutage dank unzähliger Generatoren relativ(!) einfach erstellen lassen, und sehr mächtig sind. Dasselbe gilt für eregi, ereg_replace und was noch alles in der Quick'n Dirty Liste drin ist. Später wirds hakelig, das alles aus der "Gewohnheit" rauszukriegen, und vor allem, aufgeblasenen Code durch die preg_match oder preg_replace zu ersetzen.

Für kleinere Aufgaben wie hier ist wie oben schon genannt sowas wie strpos und strstr da, ebenfalls zu empfehlen; wenn es um fixe Zeichensuche geht (keine Emailabgleiche und grosse Suchmuster) sind sie sogar schneller als ein preg_*().
 
Das wäre jetzt meine Variante. Es prüft auch nicht nur das Vorhandensein, sondern zählt auch das Zeichen. Die Ausgabe ganz unten kann natürlich rein des Zählens wegen weggelassen werden.

PHP:
<?php
$text="blahfasel@";
$suche="@";
$vorhanden=0;

for ($i=0;$i<=strlen($text);$i++){
	if ($text[$i]==$suche){
		$vorhanden++;
	}
}

if ($vorhanden>=1){
	echo "Das Zeichen '",$suche,"' ist ",$vorhanden,"x enthalten!.";
	}
else {
	echo "Das Zeichen '",$suche,"' ist nicht enthalten!.";
	} 
?>

Wenn ich es jetz mit diesem Code versuche, dann bekomm ich folgenden Error:
Notice: Uninitialized string offset: 16 in /home/.sites/127/site693/web/TEST/shop/register.php on line 76

in line 76 steht folgendes
Code:
if ($text[$i]==$suche){
 
Das müsste an der vorherigen Zeile liegen:

PHP:
for ($i=0;$i<=strlen($text);$i++){
strlen beginnt mit dem Zählen bei 1 und zählt für jeden Buchstaben 1 dazu - die Prüfung der Buchstaben mit $text[$i] beginnt allerdings mit 0 und addiert dann ebenfalls 1 pro Buchstaben dazu.
Hast du also "Hallo" als Text, gibt dir strlen 5 aus - $text[$i] geht aber von 0 bis 4 und nicht bis 5.

Ohne jetzt eine Testmöglichkeit zu haben, würde ich das "=" in $i<=strlen($text) streichen:
PHP:
for ($i=0;$i<strlen($text);$i++){
 
Zuletzt bearbeitet:
Seltsam, bei mir hat es perfekt funktioniert.

strlen zählt in der Tat die gesamten Zeichen, wobei die Schleife jedoch bei 0 anfängt und bei Länge-1 endet, allerdings läuft die Schleife auch nur so oft durch, wie der Text Zeichen hat, denn es ja die Bedingung kleiner-als--Gesamtlänge. Wenn Du nun <= als Vergleichsoperator benutzt, wird die Schleife einmal zu viel durchlaufen.

Beispiel:
bei strlen = 5 und bei "<" als Vergleichsoperator läuft die Schleife läuft nur von 0-4, da das erste Zeichen im 0ten Feld ist und das letzte im 4ten.
Bei strlen = 5 und "<=" läuft die Schleife aber von 0-5, und das letzte Zeichen ist dann leer im 5. Feld, da trotzdem nur 0-4 belegt sind.

Edit:
Scheibenhonig, ich war es ja selbst, der "<=" geschrieben hatte :wand

Hast Recht, "<" muss es heißen, wie ich ja schon selbst erklärte.
 
Zuletzt bearbeitet:
Ich hätt noch eine Weitere Möglichkeit, eine Mail auf Validität zu prüfen gefunden:
HTML:
				if (!ereg("^.+@.+\\..+$", $email))
				{
				echo "Die eingegebene Emailadresse ist nicht korrekt!<br>";
				
				}
				else {
					// DO STUFF
				}

Hier bekomm ich aber folgenden Fehler:
Deprecated: Function ereg() is deprecated in /home/.sites/127/site693/web/TEST/shop/register.php on line 54

Line 54 ist folgende
if (!ereg("^.+@.+\\..+$", $email))

Woran kann das liegen?

Auserdem müsste das Script doch abbrechen, da es mit dem If und ereg nichts anfangen kann, er macht aber trotzdem was bei // DO STUFF steht.
 
Oben