[PHP] StrPos

0

Kod:

	
	function isZakazany($StrToChk)
	{
	
	$zakazane =array("http://aow.p2a.pl/viewtopic.php?id=304", "http://aow.p2a.pl/viewtopic.php?id=343" , "<br><br>" , "<br>" , "-" , "/" ,"(",")","]","[",",","."); 
	$result =true;
	for($i=0;$i<=count($zakazane);$i++)
		{
			$chk = strpos( $StrToChk , $zakazane[$i]);
			if ($chk == 0) {$result = false;}//Jesli slowo/znak nie wystepuje zwroc false
		}
	}
	}

Błąd - nie wykrywa poprawnie kropki jesli jest $StrToChk - i tak zwraca false

Przykład -

isZakazany("<br>") //TRUE;
isZakazany(" 12.") //FALSE;
isZakazany(" asd.") //FALSE;

Rozwiązanie - ??

0
function isZakazany($StrToChk) {
	$zakazane =array("http://aow.p2a.pl/viewtopic.php?id=304", "http://aow.p2a.pl/viewtopic.php?id=343" , "<br><br>" , "<br>" , "-" , "/" ,"(",")","]","[",",",".");
	for($i=0;$i<=count($zakazane);$i++) {
                        $chk = strpos( $StrToChk , $zakazane[$i]);
                        if ($chk === 0) { return false; } //Jesli slowo/znak nie wystepuje zwroc false //TU ZMIANA!
	}
	return true;
}

@bswierczynski
Sam się zastanowiłem przez chwilę oO

0

Zaiste jest to nieprawdopodobne, że funkcja ta raz zwraca Ci true, a raz false. Nie masz w niej instrukcji return, a powinieneś mieć na końcu return $result. Chyba że ja o czymś nie wiem i w PHP jest zmienna $result podobnie jak Result z Delphi ;).

Masz jeszcze inny błąd. Nie używaj w takim wypadku strpos(stog_siana, igla) == 0. Bo jeśli igla znajduje się na samym początku zmiennej stog_siana, to jej pozycja jest rowna 0 i strpos zwróci 0. Jeśli igla NIE jest znaleziona, to strpos zwraca nie 0, tylko FALSE. Piszą o tym jak byk w manualu: http://pl.php.net/manual/en/function.strpos.php. Jeśli chcesz coś zrobić, jeśli string NIE jest znaleziony, użyj if (strpos(...) === FALSE), koniecznie z trzema znakami =.

W ogóle to wydaje mi się, że Twoja funkcja oprócz tego, że ma te błędy, to jeszcze jest bez sensu ;). Co ona ma niby robić? Tylko nie pisz, że zwrócić TRUE gdy ciąg znaków jest zakazany. Zdefiniuj dokładnie co znaczy, że ciąg znaków jest zakazany. Czy musi być jednym z ciągów z tablicy $zakazane? Czy może wystarczy, że zawiera w sobie którykolwiek z tych ciągów?

0

W takim wypadku skrypt zmienia sie w petle nieskonczona.

@bswierczynski - oczywiscie zagapilem sie i usunalem z fcji - w kodzie programu jest return $result.
Funkcja ma sprawdzic czy w podanym Stringu wystepuje jeden z stringow ktory nie powinien tam być. Jest ona skladowa innej fcji a mianowicie :

function ChangeChar($strToChange){
		global $counter;
			echo "'$strToChange' >> ";
		$counter++;
			$result = $strToChange;
			$len = strlen($strToChange);
			$znaki = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9');
		
			if ($len > 4 && isZakazany($strToChange) == 0){
				echo "<span style='color:green;position:absolute;top:$counter*30;left:300''> '$strToChange' </span><br>";
				$miejsce = rand(1,$len-1);
				$char = $znaki[rand(0,count($znaki))-1];
				$result = substr($strToChange,0,$miejsce).$char.substr($strToChange,$miejsce);				
				return $result;
				
			}
			else 
			return $strToChange;
		
		}

nie zmienia to faktu ze "===" daja petle nieskonczona

Jesli uzywam StrPos to jest chyba oczywiste ze musi byc skladowa :P

0

WTF?!
Chyba użyłeś "===" nie w tym miejscu co trzeba...

if ($chk === 0) { return false; }

To nie ma prawa najmniejszego zmieniać pętli w nieskończoną bo różni się tylko warunek IFa, nawet jeśli nie trafiłoby w $chk ani razu to po wyjściu z pętli funkcja zwróciłaby TRUE, więc nie rozumiem.

0

A jednak blad byl gdzie indziej jeszcze i panowie nie zauważyli :P

Nie

$i<=count($zakazane)

a $i<count($zakazane) //Bez =

 

Pozatym całego ifka trzeba odwrócic bo jeśli elem ktory sprawdzamy nie jest na koncu to nadpisze return (chociaz z tego co czytalem return zwraca wartosc i przerywa dzialanie funkcji dalej)

Cały kod fcji:
```php
	function isZakazany($StrToChk) {
		
        $zakazane = array("http://aow.p2a.pl/viewtopic.php?id=304", "http://aow.p2a.pl/viewtopic.php?id=343" , "<br><br>" , "<br>" , "-" , "(",")","]","[",",",".");
		for($i=0;$i<count($zakazane);$i++) 
			{
                $chk = strpos($StrToChk ,$zakazane[$i]);
				if ($chk !== false) {return 1;} //Jesli slowo/znak wystepuje to zwroc true
			}
		return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1