Avatar billede phrozia Juniormester
26. oktober 2016 - 17:12 Der er 6 kommentarer og
2 løsninger

Indlæsning ved array

Hejsa!

Jeg indlæser en fil med blacklisted ord via:

[code]
$lines = file('banned-words.txt');

foreach ($lines as $line_num => $line) {
    $blacklist[] = $line;
}
[/code]

Efterfølgende kører jeg

[code]
foreach ($blacklist as $blacklist_word)
        {
        if(strpos($code, $blacklist_word))
            {
            echo "Bad code: " . $code . "<br>";
            }
        }
[/code]

Men selvom der findes et blacklisted ord (f.eks. tis), så bliver if'en ikke true.

Dog, hvis jeg lige før if'en sætter

[code]
$blacklist_word = "tis";
[/code]

Så bliver ordet "set" korrekt og if'en kører hvis "tis" er fundet.

Så hvad er der lige der sker ved min indlæsning fra .txt filen som gør, at den ser ordet anderledes?
Avatar billede olsensweb.dk Ekspert
26. oktober 2016 - 17:42 #1
står der et ord på hvert linje ??
får du fjernet dit linje skift ??
kunne tønkes den indlæsser som "tis\n\r"

hvad er din $code ?? er det dit ord ??
Avatar billede Slater Ekspert
26. oktober 2016 - 17:42 #2
file() inkluderer linjeskift. Jeg vil skyde på at det er dit problem. Du kan smide FILE_IGNORE_NEW_LINES med som andet parameter i file() funktionen, men det virker ikke med Windows-linjeskift i nogle versioner af PHP, så bedre er at køre trim() på alle ordene før du sammenligner.
Avatar billede olsensweb.dk Ekspert
26. oktober 2016 - 17:42 #3
tønkes => tænkes
Avatar billede phrozia Juniormester
28. oktober 2016 - 11:14 #4
Tak for indspark! Jeg har desværre ikke mulighed for at teste før mandag, men skal nok vende tilbage.
Avatar billede phrozia Juniormester
01. november 2016 - 17:32 #5
Hej igen.

Ja, banned-words.txt har ét ord per linie.
$code kan være f.eks. PUSPSS, KNUNKN, TISPKX, KSTISD, osv.

Jeg har sat både FILE_IGNORE_NEW_LINES og trim() på, og nu begynder det at se korrekt ud. Nu fanger den de banned dele, men kun hvis $code ikke starter med dem. Dvs. at TISKJJ ikke bliver fanget mens KSTISK gør.

Det må være en stringpos ting som er en anden fejl. Tror måske den kan løses med noget array_filter. Afprøver lige i morgen.
Avatar billede olsensweb.dk Ekspert
01. november 2016 - 17:53 #6
>Det må være en stringpos ting som er en anden fejl.
du skal bare teste på det rigtige.

ref http://php.net/manual/en/function.strpos.php
Returns the position of where the needle exists relative to the beginning of the haystack string (independent of offset). Also note that string positions start at 0, and not 1.


check på false
eks 1

<?php
$mystring = 'abc';
$findme  = 'a';
$pos = strpos($mystring, $findme);

// Note our use of ===.  Simply == would not work as expected
// because the position of 'a' was the 0th (first) character.
if ($pos === false) {
    echo "The string '$findme' was not found in the string '$mystring'";
} else {
    echo "The string '$findme' was found in the string '$mystring'";
    echo " and exists at position $pos";
}
?>
Avatar billede Rune1983 Ekspert
02. november 2016 - 07:36 #7
Hvis Olsen har ret med hensyn til "\n\r" er ny linie. Tænker man kan anvende funktionen "explode". Den opretter et array med elementer hvor elementerne er adskilt, i dit tilfælde "\n\r".

eksempel
$words = explode('\n\r ',$lines);
print_r($words);
Avatar billede phrozia Juniormester
02. november 2016 - 12:09 #8
@olsenweb.dk
Ah sandt nok. Den havde jeg faktisk været inde på, men det var i perioden hvor "\n\r" var et problem.

Det var iøvrigt FILE_IGNORE_NEW_LINES som gjorde forskellen, trim() havde inden umiddelbart effekt.

Det virker perfekt med
[code]
    foreach ($blacklist as $blacklist_word)
        {
        $pos = stripos($code, $blacklist_word);

        if($pos !== false)
            {
            //echo "Bad code: " . $code . "<br>";
            $invalid_code = true;
            }
        }
[/code]
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester