Autor Zpráva
hugo123
Profil *
Ahojte,

potrebujem zistit, ci dany string obsahuje vsetky znaky s urciteho pola znakov.

Mame napriklad:

$cisla = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "A");

A chcem vediet ci $slovo obsahuje VSETKY znaky z tohto pola.

Existuje prosim na to nieco v PHP?

Vopred dakujem velmi pekne.
midlan
Profil
Tady jsem ti na to udělal funkci:
function obsahuje_slovo_znaky($slovo, array $znaky) {
  $slovo = str_split($slovo);
  foreach($znaky as $poradi => $hledany_znak) {
    foreach($slovo as $znak_slova) {
      if($hledany_znak === $znak_slova) {
        unset($znaky[$poradi]);
        break;
      }
    }
  }
  return empty($znaky);
}
DarkMeni
Profil
Pokud může obsahovat všechny znaky z pole a k tomu i další které v tam nejsou, tak třeba takto
<?php
    function check($string){
        foreach(
            array(
                '0', '1', 'a', 'b', 'c'
            ) as $character
        ){
            if(strpos($string, $character) === false){
                return false;
            }
        }
        return true;
    }
    var_dump(check('01abc'), check('abcd'), check('01abcd'));
?>
A když to nesmí obsahovat jiný znaky než co jsou v poli, tak by to bylo možná trochu složitější (nejjedodušší zápis by byl asi přes regularní výrazy - preg_match), ale jestli to má nějakou zákonitost na pořadí, kdy se který znak objeví, tak by to asi šlo i jednodušeji
hugo123
Profil *
Dakujem velmi pekne!!!!, ja potrebujem take, ze zadany string bude obsahovat LEN zadane znaky, ak tam je akykolvek iny znak, tak je to FALSE.
Michal Maršálek
Profil
Dobrý den,
této funkci předáš text na kterém to chceš testovat, znaky které to má obsahovat a zda to má obsahovat jen dané znaky.
function textObsahujeZnaky($text, $znaky, $jenDaneZnaky){
    if($jenDaneZnaky){//pokud chceš, aby tam nebyl žádný jiný znak, ale nemusí tam být všechny
        $text=str_split($text);
        foreach($text as $znakTextu){
            $znakJeOK=false;
            foreach($znaky as $znak){
                if($znakTextu==$znak){
                    $znakjeOK=true;
                    break;
                }
            }
            if(!$znakJeOK)return false;
        }
        return true;
    }
    else{//pokud chceš, aby tam byl každý ze znaků, ale můžou tam být jiné znaky
        foreach($znaky as $znak){
            if(strpos($text, $znak) === false){
                return false;
            }
        }
        return true;
    }
}
Snad jsem tam nikde neudělal chybu.
juriad
Profil
pokud má text obsahovat pouze znaky a,b,c,d , lze použít následující regulární výraz:
^(?=[^a]*a)(?=[^b]*b)(?=[^c]*c)(?=[^d]*d)[abcd]*$
význam jednotlivých závorek: zkouší jestli někde v textu je obsaženo x; toto se testuje pro všechna možná x
a na závěr [abcd]* je otestuje, zda text obsahuje jen povolené znaky

nebude to nejspíš příliš efektivní, zvlášť pokud budeš pořád používat jiný regulární výraz, ale na druhou stranu to poskytuje jednoduchý zápis
výraz jsem trochu zjednodušil
midlan
Profil
řešení regulárním výrazem jen pro dané znaky od juriad moc nechápu, navrhuji řešení regulárním výrazem tímto způsobem (řešení pro autora threadu pro znaky 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, A i s použitím preg_match):
preg_match('~^[\\dA]+$~s', $string);
juriad
Profil
midlan:
tvůj regexp bohužel nevynutí, aby text obsahoval všechny číslice 0-9, projde třeba "01". Víceméně tvůj regexp dělá přesně to samé jako poslední člen mého: ^[abcd]*$
Já navíc napřed zkontroluji, jestli text obsahuje každý z požadovaných znaků:
(?=xxx) testuje, jestli bezprostředně následuje xxx, tedy (?=[^x]*x) testuje, jestli někde dále následuje x
Tori
Profil
hugo123:
dany string obsahuje vsetky znaky s urciteho pola znakov.
chcem vediet ci $slovo obsahuje VSETKY znaky z tohto pola.
zadany string bude obsahovat LEN zadane znaky, ak tam je akykolvek iny znak, tak je to FALSE.

Dá se to udělat i takhle (ale na rozdíl od regulárů to asi nebude fungovat pro texty s diakritikou v UTF-8, tj. vícebajtové znaky):
$cisla = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "A");
$x = 'testovany retezec';
$povolene = (str_replace($cisla, '', $x) === ''); // true, ak obsahuje jen povolene znaky
$vsechny = (str_replace(str_split($x), '', implode($cisla)) === ''); // true, ak obsahuje vsechny povolene znaky (muzou se opakovat)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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