PHP Variable mit mehren Strings

  • Ersteller Ersteller mustermen
  • Erstellt am Erstellt am
M

mustermen

Gast
Die Variable $blocker soll mehrere Strings haben. Sobald auch nur ein Wort in $text vorkommt soll es geblockt werden. Nur leider funktioniert das nur mit dem Wort href und das auch nur wen es dort ganz alleine steht, sobald dort: "<a href="http:www.test.de>test</a>" funktioniert es nicht. Was mache ich Falsch?
PHP:
//Wie lange hat der Eintrag gedauert und ist Spam enthalten?
	$blocker = "href; .com; .COM; .de; .DE; www.; WWW.; <a; </a>";
	if ((time() - $_POST['timestamp'] > 6) && (time() - $_POST['timestamp'] < 1800) && ($text != $blocker) && ($text != " "))
 
Hi, erst mal wäre es sinnvoller die zu blockenden Befehle in ein Array zu packen.

Wenn du es so lassen willst, wäre str_pos die richtige wahl für dich (oder str_ipos). Schauste hier str_post bei PHP Manual
 
Koki_87 schrieb:
Hi, erst mal wäre es sinnvoller die zu blockenden Befehle in ein Array zu packen.

Wenn du es so lassen willst, wäre str_pos die richtige wahl für dich (oder str_ipos). Schauste hier str_post bei PHP Manual

Also ich würde ja reguläre Ausdrücke empfehlen. Die sind für solche Anwendungsfälle ideal.
 
Reguläre Ausdrücke sind hier alles andere als Ideal. Es fängt schon damit an, dass man den Ausdruck jedes mal ändern muss, wenn ein neues Wort hinzukommt. Im Allgemeinen basieren reguläre Ausdrücke desweiteren auf Mustern, das Wort Muster impliziert imho schon, dass es sich dabei um etwas statisches, nicht aber dynamisches handelt.
Viel besser wäre, wie schon genannt wurde, ein Array und dazu dann die Funktion in_array ( $needle , array $haystack)
http://www.php.net/manual/de/function.in-array.php

edit: das nehme ich zurück, wenn du als Anwendungsfall jetzt speziell das Suchen von Elementen in einem großen Fließtext (z.B. HTML) gemeint hast. Dachte es geht erstmal nur um das Anwenden auf isolierte Wörter.
 
Zuletzt bearbeitet:
Wenn man nur eine Anzahl fixer Ausdrücke prüfen will (und nicht ihre Anordnung zueinander, Wiederholung etc.), sind RegEx etwas übers Ziel hinausgeschossen. Der strpos-Ansatz aus dem ersten Post sollte genügen, auf der php-Seite sind in den Kommentaren unten auch massig Bespiele für die Verwendung mit mehreren Suchwörtern.

in_array sucht doch in mehreren Suchtexten nach einem bestimmten Suchwort, also genau anders herum als der Threadersteller es braucht. Oder ich habe die Methode beim Überfliegen falsch verstanden?
 
Zuletzt bearbeitet:
.fF schrieb:
in_array sucht doch in mehreren Suchtexten nach einem bestimmten Suchwort, also genau anders herum als der Threadersteller es braucht. Oder ich habe die Methode beim Überfliegen falsch verstanden?

Ja stimmt, siehe edit. Ich dachte es geht um isolierte Wörter.
 
Jo danke er sagt schon mal das es Spam ist, aber mit einem Fehler.

"Warning: strpos() [function.strpos]: needle is not a string or an integer in C:\xampp\htdocs\cjw\gbsend.php on line 18
Spamverdacht!"

PHP:
<?php

if (isset( $_POST['submit'] ))
{
    // Maskierende Slashes aus POST Array entfernen
    if (get_magic_quotes_gpc()) { $_POST = array_map( 'stripslashes', $_POST ); }
    $name    = $_POST['name'];
    $email = $_POST['email'];
	$text = $_POST['text'];
 
    // Neues Datenbank-Objekt erzeugen
	$db = @new mysqli( 'localhost', 'root', '', 'gb' );
	
	//Wie lange hat der Eintrag gedauert und ist Spam enthalten
	//Hier fängt needle an!!!!!!!!!!!!!!!!!!!!!!
	$needle = array("href", ".de", ".com", "<a", "</a>", "www");
	
	$blocker = stripos($text, $needle);
	
	if ((time() - $_POST['timestamp'] > 6) && (time() - $_POST['timestamp'] < 1800) && ($blocker === true) && ($text != " "))
	{
		// Pruefen ob die Datenbankverbindung hergestellt werden konnte
		if (mysqli_connect_errno() == 0)
		{
			$datum = date('d.m.Y');
			$sql = 'INSERT INTO `gb` (`name`, `email`, `text`, `datum`) VALUES (?, ?, ?, ?)';
			$eintrag = $db->prepare( $sql );
			$eintrag->bind_param( 'ssss', $name, $email, $text, $datum );
			$eintrag->execute();
			// Pruefen ob der Eintrag efolgreich war
			if ($eintrag->affected_rows == 1)
			{
				echo 'Der neue Eintrage wurde hinzugef&uuml;gt.';
				header('Location: gb.php');
			}
			else
			{
				echo 'Der Eintrag konnte nicht hinzugef&uuml;gt werden.';
			}
		}
		else
		{
			// Es konnte keine Datenbankverbindung aufgebaut werden
			echo 'Die Datenbank konnte nicht erreicht werden. Folgender Fehler trat auf: <span class="hinweis">' .mysqli_connect_errno(). ' : ' .mysqli_connect_error(). '</span>';
		}
	} else {
		//Spam-Alarm!
		echo 'Spamverdacht!';
	}
	
    // Datenbankverbindung schliessen
    $db->close();
}
 
?>
 
Ich habe $needle doch einen String als Wert gegeben, da sind doch Buchstaben drinnen, also ein String?

PHP:
$needle = array("href", ".de", ".com", "<a", "</a>", "www");
 
carom schrieb:
Ja stimmt, siehe edit.
Ich dachte dein Edit bezieht sich auf deine Aussage über die Eignung von RegEx. War wohl schon zu spät. :)

@mustermen:
Du musst das Array per foreach verarbeiten. Es gibt Suchfunktionen, die ganze Arrays verarbeiten können, strpos kann das glaube ich aber nicht.

PHP:
$needle = array("href", ".de", ".com", "<a", "</a>", "www");
foreach ($needle as $searchstring) {
    $blocker = stripos($text, $searchstring);
    if ($blocker /* gewünschte Bedingung*/) break;
}
 
Zurück
Oben