Autor Zpráva
jozko007
Profil
Ahojte,
už asi dva dni hladam poriadný filter nadavok
chcem aby plnil tieto funkcie:
napr slovo chuj

aby slovo oddychujem bolo cele a ked niekdo napiše chuuuuuuuuuj alebo CHUJ tak aby sa tiež zablokovalo a tiež by bodlo sklonovanie chuja
volakedy som našiel zdrojak aj z prikladom ale nefungovalo mi to:
niečo podobne hlada aj tento uzivatel:
Podobný filter

Za každu pomoc vopred Dakujem!
Destiny_1
Profil
Tohle jsem ti v rychlosti sesmolil... vyzkoušej a napiš jestli ti to vyhovuje.
<?php
 function detect($title) {
    static $convertTable = array (
        'á' => 'a', 'Á' => 'A', 'ä' => 'a', 'Ä' => 'A', 'č' => 'c',
        'Č' => 'C', 'ď' => 'd', 'Ď' => 'D', 'é' => 'e', 'É' => 'E',
        'ě' => 'e', 'Ě' => 'E', 'ë' => 'e', 'Ë' => 'E', 'í' => 'i',
        'Í' => 'I', 'ï' => 'i', 'Ï' => 'I', 'ľ' => 'l', 'Ľ' => 'L',
        'ĺ' => 'l', 'Ĺ' => 'L', 'ň' => 'n', 'Ň' => 'N', 'ń' => 'n',
        'Ń' => 'N', 'ó' => 'o', 'Ó' => 'O', 'ö' => 'o', 'Ö' => 'O',
        'ř' => 'r', 'Ř' => 'R', 'ŕ' => 'r', 'Ŕ' => 'R', 'š' => 's',
        'Š' => 'S', 'ś' => 's', 'Ś' => 'S', 'ť' => 't', 'Ť' => 'T',
        'ú' => 'u', 'Ú' => 'U', 'ů' => 'u', 'Ů' => 'U', 'ü' => 'u',
        'Ü' => 'U', 'ý' => 'y', 'Ý' => 'Y', 'ÿ' => 'y', 'Ÿ' => 'Y',
        'ž' => 'z', 'Ž' => 'Z', 'ź' => 'z', 'Ź' => 'Z',
    );
    $title = strtolower(strtr($title, $convertTable));
    $title = preg_replace('/[^a-zA-Z0-9]+/u', '', $title);
    $title=  str_split($title);
    $a='';
    $b='';
    foreach ($title as $value) {
        if ($b!=$value) {
         $a.=$value;   
        }
        $b=$value;
    }
    
    return $a;
}
$pole=array();
$pole['sracove']="";
$pole['srac']="";
$sprosteslovo=detect("sráááááčovéééé");
if (isset($pole[$sprosteslovo])) {
echo "bylo detekováno sprosté slovo";    
} else {
echo "tohle slovo je v pořádku";    
}



a na celé věty by se dalo použít třeba tohle

<?php
 function detect($title,$sprosta_slova) {
    $var='';
     $text=preg_split("/[\s]+/",$title); 
     foreach ($text as $array) {
    static $convertTable = array (
        'á' => 'a', 'Á' => 'A', 'ä' => 'a', 'Ä' => 'A', 'č' => 'c',
        'Č' => 'C', 'ď' => 'd', 'Ď' => 'D', 'é' => 'e', 'É' => 'E',
        'ě' => 'e', 'Ě' => 'E', 'ë' => 'e', 'Ë' => 'E', 'í' => 'i',
        'Í' => 'I', 'ï' => 'i', 'Ï' => 'I', 'ľ' => 'l', 'Ľ' => 'L',
        'ĺ' => 'l', 'Ĺ' => 'L', 'ň' => 'n', 'Ň' => 'N', 'ń' => 'n',
        'Ń' => 'N', 'ó' => 'o', 'Ó' => 'O', 'ö' => 'o', 'Ö' => 'O',
        'ř' => 'r', 'Ř' => 'R', 'ŕ' => 'r', 'Ŕ' => 'R', 'š' => 's',
        'Š' => 'S', 'ś' => 's', 'Ś' => 'S', 'ť' => 't', 'Ť' => 'T',
        'ú' => 'u', 'Ú' => 'U', 'ů' => 'u', 'Ů' => 'U', 'ü' => 'u',
        'Ü' => 'U', 'ý' => 'y', 'Ý' => 'Y', 'ÿ' => 'y', 'Ÿ' => 'Y',
        'ž' => 'z', 'Ž' => 'Z', 'ź' => 'z', 'Ź' => 'Z',
    );
    $title = strtolower(strtr($array, $convertTable));
    $title = preg_replace('/[^a-zA-Z0-9]+/u', ' ', $title);
    $title=  str_split($title);
    $a='';
    $b='';
    foreach ($title as $value) {
        if ($b!=$value) {
         $a.=$value;   
        }
        $b=$value;
    }
        if (preg_match("/(".implode("|",$sprosta_slova).")/", $a)){
      $var.="**** ";
    } else {
      $var.=$array." ";  
    }
     }
    return trim($var);
}



$sprostaslova=array("pondeli","utery","streda","ctvrtek","patek","sobota");
$text="Oskaři,v pondělí jsem objednával SIM kartu,ale přišla až v úterýýý..Kde je chyba?";
echo detect($text,$sprostaslova);
jozko007
Profil
Vypisuje mi chybu v php
Warning: implode(): Invalid arguments passed in 
iba som premenoval function filter
bolo by dobre keby to koncilo
return $nadavka;
  }
juriad
Profil
jozko007:
A proč si prostě nenapíšeš hromadu regexů, kterou provedeš na transliterovaný text?
/\bc+h+u+j+(a+|o+v+e+|e+m+)?\b/i
/\bh+o+v+a+d+(o+|a+|y+|u+|e+m+)\b/i
Každý znak se může opakovat (to je ten symbol +).
Hranice slova je \b.
Část v závorce jsou svislítkem oddělené alternativní nepovinné přípony - nepovinné = otazník.
Lomítka na začátku a na konci jsou jen ohraničení a znak i na konci značí ignorování velikosti písmen.
Destiny_1
Profil
Znovu jsem tu funkci upravil, ta předchozí vynechávala některá slova.
No a když si nakopíruješ do scriptu přesně tohle:

<?php
 function filter($title,$sprosta_slova) {
        static $convertTable = array (
        'á' => 'a', 'Á' => 'A', 'ä' => 'a', 'Ä' => 'A', 'č' => 'c',
        'Č' => 'C', 'ď' => 'd', 'Ď' => 'D', 'é' => 'e', 'É' => 'E',
        'ě' => 'e', 'Ě' => 'E', 'ë' => 'e', 'Ë' => 'E', 'í' => 'i',
        'Í' => 'I', 'ï' => 'i', 'Ï' => 'I', 'ľ' => 'l', 'Ľ' => 'L',
        'ĺ' => 'l', 'Ĺ' => 'L', 'ň' => 'n', 'Ň' => 'N', 'ń' => 'n',
        'Ń' => 'N', 'ó' => 'o', 'Ó' => 'O', 'ö' => 'o', 'Ö' => 'O',
        'ř' => 'r', 'Ř' => 'R', 'ŕ' => 'r', 'Ŕ' => 'R', 'š' => 's',
        'Š' => 'S', 'ś' => 's', 'Ś' => 'S', 'ť' => 't', 'Ť' => 'T',
        'ú' => 'u', 'Ú' => 'U', 'ů' => 'u', 'Ů' => 'U', 'ü' => 'u',
        'Ü' => 'U', 'ý' => 'y', 'Ý' => 'Y', 'ÿ' => 'y', 'Ÿ' => 'Y',
        'ž' => 'z', 'Ž' => 'Z', 'ź' => 'z', 'Ź' => 'Z',
    );
        $var='';
     $text=preg_split("/([^".implode("",array_keys($convertTable))."a-zA-Z0-9]+)/",$title , -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
     foreach ($text as $array) {
    $title = strtolower(strtr($array, $convertTable));
    $title = preg_replace('/[^a-zA-Z0-9]+/u', ' ', $title);
    $title=  str_split($title);
    $a='';
    $b='';
    foreach ($title as $value) {
        if ($b!=$value) {
         $a.=$value;   
        }
        $b=$value;
    }
        if (preg_match("/(".implode("|",$sprosta_slova).")/", $a)){
      $var.="****";
    } else {
      $var.=$array;  
    }
     }
    return trim($var);
}



$sprostaslova=array("pondeli","utery","streda","ctvrtek","patek","sobota");
$text="Oskaři,v pondělí jsem objednával SIM kartu,ale přišla až v úterýýý..Kde je chyba?";
echo filter($text,$sprostaslova);

Tak by ti to mělo vrátit "Oskaři,v **** jsem objednával SIM kartu,ale přišla až v ****..Kde je chyba?"
Chybu by to házet nemělo.
No a jak si to přesně představuješ? že ti ta funkce vrátí sprostá slova?
Nebylo by lepší, kdyby to ty sprostá slova rovnou smazala a nahradila je třeba za hvězdičky, tak jak je to teď?
juriad
Profil
Destiny_1:
Ale smazáním či vyhvězdičkováním mohou vzniknout nová sprostá slova. Toho jde pěkně zneužít. :-)
cchujhchujuchujj -> c****h****u****j
Bubák
Profil
Destiny_1:
Pokud mezi sprostými slovy bude lidové označení pro fekálie, tak neprojde ani knihovna.
Kód začínáš <?php, ale chybí ?>, to může lidem při kopírování bez přemýšlení dělat problémy.
Destiny_1
Profil
juriad:
cchujhchujuchujj mi vrátil **** což mi připomíná že to nesplňuje jozkovi požadavky
aby slovo oddychujem bolo cele
Proto by se měl 30. řádek změnit na:
if (preg_match("/^(".implode("|",$sprosta_slova).")$/", $a)){

Bubák:
Kód začínáš <?php, ale chybí ?>, to může lidem při kopírování bez přemýšlení dělat problémy.
Díky za upozornění, dám si příště pozor.
jozko007
Profil
stale mi to vypisuje chybu implode
kod som upravil lebo echo nemozem dať dal som return
function filter($title,$sprosta_slova) {
        static $convertTable = array (
        'á' => 'a', 'Á' => 'A', 'ä' => 'a', 'Ä' => 'A', 'č' => 'c',
        'Č' => 'C', 'ď' => 'd', 'Ď' => 'D', 'é' => 'e', 'É' => 'E',
        'ě' => 'e', 'Ě' => 'E', 'ë' => 'e', 'Ë' => 'E', 'í' => 'i',
        'Í' => 'I', 'ï' => 'i', 'Ï' => 'I', 'ľ' => 'l', 'Ľ' => 'L',
        'ĺ' => 'l', 'Ĺ' => 'L', 'ň' => 'n', 'Ň' => 'N', 'ń' => 'n',
        'Ń' => 'N', 'ó' => 'o', 'Ó' => 'O', 'ö' => 'o', 'Ö' => 'O',
        'ř' => 'r', 'Ř' => 'R', 'ŕ' => 'r', 'Ŕ' => 'R', 'š' => 's',
        'Š' => 'S', 'ś' => 's', 'Ś' => 'S', 'ť' => 't', 'Ť' => 'T',
        'ú' => 'u', 'Ú' => 'U', 'ů' => 'u', 'Ů' => 'U', 'ü' => 'u',
        'Ü' => 'U', 'ý' => 'y', 'Ý' => 'Y', 'ÿ' => 'y', 'Ÿ' => 'Y',
        'ž' => 'z', 'Ž' => 'Z', 'ź' => 'z', 'Ź' => 'Z',
    );
        $var='';
     $text=preg_split("/([^".implode("",array_keys($convertTable))."a-zA-Z0-9]+)/",$title , -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
     foreach ($text as $array) {
    $title = strtolower(strtr($array, $convertTable));
    $title = preg_replace('/[^a-zA-Z0-9]+/u', ' ', $title);
    $title=  str_split($title);
    $a='';
    $b='';
    foreach ($title as $value) {
        if ($b!=$value) {
         $a.=$value;   
        }
        $b=$value;
    }
       if (preg_match("/^(".implode("|",$sprosta_slova).")$/", $a)){       
       $var.="****";
    } else {
      $var.=$array;  
    }
     }
    return trim($var);

$sprostaslova=array("pondeli","utery","streda","ctvrtek","patek","sobota");
return filter($title,$sprostaslova);
}

tento skript mi funguje a už ciastočne plni moju funkciu
       function filter($text){
 $filterWords = array('c+h+u+j+(a+|o+v+e+|e+m+)','smrd','pici','chuj','pici');
 $filterCount = sizeof($filterWords);
 for($i=0; $i<$filterCount; $i++){
  $text = preg_replace('/\b'.$filterWords[$i].'?\b/i',"*",$text);
 }
 return $text;
}
Destiny_1
Profil
jozko007:
to echo tam bylo jen pro test, aby sis to vyzkoušel:

A tohle co jsi předělal:
$sprostaslova=array("pondeli","utery","streda","ctvrtek","patek","sobota");
return filter($title,$sprostaslova);
Je tam naprosto zbytečně, a chybu v implode ti to háže, asi protože jako druhý argument do funkce neodesíláš array
jozko007
Profil
soory mozem vydiet cely zdrojak?
lepšie sa mi to chape
Destiny_1
Profil
vytvoř si nový php soubor a vlož si tam pouze tohle:

<?php
header('Content-type: text/html;charset=UTF-8');


 function filter($title,$sprosta_slova) {
        static $convertTable = array (
        'á' => 'a', 'Á' => 'A', 'ä' => 'a', 'Ä' => 'A', 'č' => 'c',
        'Č' => 'C', 'ď' => 'd', 'Ď' => 'D', 'é' => 'e', 'É' => 'E',
        'ě' => 'e', 'Ě' => 'E', 'ë' => 'e', 'Ë' => 'E', 'í' => 'i',
        'Í' => 'I', 'ï' => 'i', 'Ï' => 'I', 'ľ' => 'l', 'Ľ' => 'L',
        'ĺ' => 'l', 'Ĺ' => 'L', 'ň' => 'n', 'Ň' => 'N', 'ń' => 'n',
        'Ń' => 'N', 'ó' => 'o', 'Ó' => 'O', 'ö' => 'o', 'Ö' => 'O',
        'ř' => 'r', 'Ř' => 'R', 'ŕ' => 'r', 'Ŕ' => 'R', 'š' => 's',
        'Š' => 'S', 'ś' => 's', 'Ś' => 'S', 'ť' => 't', 'Ť' => 'T',
        'ú' => 'u', 'Ú' => 'U', 'ů' => 'u', 'Ů' => 'U', 'ü' => 'u',
        'Ü' => 'U', 'ý' => 'y', 'Ý' => 'Y', 'ÿ' => 'y', 'Ÿ' => 'Y',
        'ž' => 'z', 'Ž' => 'Z', 'ź' => 'z', 'Ź' => 'Z',
    );
        $var='';
     $text=preg_split("/([^".implode("",array_keys($convertTable))."a-zA-Z0-9]+)/",$title , -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
     foreach ($text as $array) {
    $title = strtolower(strtr($array, $convertTable));
    $title = preg_replace('/[^a-zA-Z0-9]+/u', ' ', $title);
    $title=  str_split($title);
    $a='';
    $b='';
    foreach ($title as $value) {
        if ($b!=$value) {
         $a.=$value;   
        }
        $b=$value;
    }
        if (preg_match("/^(".implode("|",$sprosta_slova).")$/", $a)){
      $var.="****";
    } else {
      $var.=$array;  
    }
     }
    return trim($var);
}


//tady místo dnů, napíšeš do array sprostá slova
$sprostaslova=array("pondeli","utery","streda","ctvrtek","patek","sobota"); 
$text="Oskaři,v pondělí jsem objednával SIM kartu,ale přišla až v úterýýý..Kde je chyba?";
echo filter($text,$sprostaslova);
?>
jozko007
Profil
v samostatnom subore to funguje! SUPER! aj z prikladom ale ked to chcem dat do mojho suboru
tam tak piše tu chybu :(
Destiny_1
Profil
tak pošli soubor a já ti řeknu, kde děláš chybu
jozko007
Profil
ok poslem ti ho cez e-mail cez icq cez skype?

e-mail Prihlas(zavináč)gmail.com
lionel messi
Profil
jozko007:
ok poslem ti ho cez e-mail cez icq cez skype?
Sme na verejnom fóre, takže Pravidla diskuse JPW a doporučení » 7. Nechtějte, aby vám lidi posílali odpověď mailem. Je-li veřejně dostupný dotaz, má být veřejně dostupná i odpověď.

Bolo by lepšie poslať súbor sem.
Destiny_1
Profil
jozko007:
Jo, lepší to bude poslat sem, nebo třeba sem http://pastebin.com/
jozko007
Profil
aha dakujem za pomoc!
Pastebin
Destiny_1
Profil
Ty jsi nepochopil, že to array musíš zadávat tam, kde voláš tu funkci, ale to nevadí, upravil jsem to tak, aby jsi to volal jenom s jedním argumentem.
Ale v tom případě sprostá slova budeš muset přidávat uvnitř funkce
jozko007
Profil
NO SUPER!
uz mi to funguje!
Ked mozem poprosit odstran ten link.
Pre vsetkych davam llink sem:
function filter($title) {
static $sprosta_slova=array("pondeli","utery","streda","ctvrtek","patek","sobota");
 
        static $convertTable = array (
        'á' => 'a', 'Á' => 'A', 'ä' => 'a', 'Ä' => 'A', 'č' => 'c',
        'Č' => 'C', 'ď' => 'd', 'Ď' => 'D', 'é' => 'e', 'É' => 'E',
        'ě' => 'e', 'Ě' => 'E', 'ë' => 'e', 'Ë' => 'E', 'í' => 'i',
        'Í' => 'I', 'ï' => 'i', 'Ï' => 'I', 'ľ' => 'l', 'Ľ' => 'L',
        'ĺ' => 'l', 'Ĺ' => 'L', 'ň' => 'n', 'Ň' => 'N', 'ń' => 'n',
        'Ń' => 'N', 'ó' => 'o', 'Ó' => 'O', 'ö' => 'o', 'Ö' => 'O',
        'ř' => 'r', 'Ř' => 'R', 'ŕ' => 'r', 'Ŕ' => 'R', 'š' => 's',
        'Š' => 'S', 'ś' => 's', 'Ś' => 'S', 'ť' => 't', 'Ť' => 'T',
        'ú' => 'u', 'Ú' => 'U', 'ů' => 'u', 'Ů' => 'U', 'ü' => 'u',
        'Ü' => 'U', 'ý' => 'y', 'Ý' => 'Y', 'ÿ' => 'y', 'Ÿ' => 'Y',
        'ž' => 'z', 'Ž' => 'Z', 'ź' => 'z', 'Ź' => 'Z',
    );
        $var='';
     $text=preg_split("/([^".implode("",array_keys($convertTable))."a-zA-Z0-9]+)/",$title , -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
     foreach ($text as $array) {
    $title = strtolower(strtr($array, $convertTable));
    $title = preg_replace('/[^a-zA-Z0-9]+/u', ' ', $title);
    $title=  str_split($title);
    $a='';
    $b='';
    foreach ($title as $value) {
        if ($b!=$value) {
         $a.=$value;  
        }
        $b=$value;
    }
        if (preg_match("/^(".implode("|",$sprosta_slova).")$/", $a)){
      $var.="****";
    } else {
      $var.=$array;  
    }
     }
    return trim($var);
}
 
 
jozko007
Profil
Ok este par otázok
aby sa nezobrazovalo ked zadam napr
*c*h*u*j*

miesto * moze byt aj ?!:@-+
Dasa to cez tu static $convertTable
'*a*' => 'a',
len to by som musel vytvorit asi velku tabulku.
Da sa to jednoduchšie?
Destiny_1
Profil
můžeš tam přidat tohle:
'*' => '',
Sice mi to přijde zbytečné, ale jak chceš ...
Bubák
Profil
'*' => '', '?' => '', '!' => '', ':' => '', '@' => '', '+' => '', '-' => '', '|' => '', '/' => '', '\' => '', ' ' => '',
Pak přijde někdo, kdo ti napíše сhuj anebo c­h­u­j a budeš se divit, jak je možné, že ti to prošlo přes filtr.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0