Autor Zpráva
Jcas
Profil *
Dobrý den
Moc rád bych poprosil o pomoc, protože reg.v. absolutně nemůžu pochopit.
Mám input, kam už. může zadat více možností (p=písmeno, č=číslo, a možné znaky /, -:
č, pč, čp, č-p, p-č,
A nebo kteroukoliv tuto kombinaci 2*oddělenou znakem / (např. č / p-č)

Převod písmen na velká zvládnu. Bílé mezery na konci a na kraji také. Ale potřebuji to silněji omezit, protože se to dle tohoto pole také seřazuje do pořadí. Takže bych potřeboval silnější kokntrolu, do přesného formátu.

1. Neobsahuje-li řetězec znak / : Odstranit mezery uprostřed řetězce
2.Obsahuje-li řetězec / tak formát č(čp, pč atd.)mezera/mezerač(čp, pč atd.) a opět v částech č(čp, pč atd.) odstranit mezery uprostřed.

Lepší by bylo, kdyby se to upravilo samo, ale klidně by se to dalo hodit do formy kontroly, kdy si pak vyhodím hlášku"špatný formát"

Mockrát děkuju
Tori
Profil
Jcas:
1. Pokud mám jen sekvenci prvků, oddělených čárkami, bez lomítka - podle čeho se ve výsledku určí to číslo před závorkou? Je to prostě první zadaný prvek? Pokud ano, lze nějak určit toto číslo, když např. uživatel zadá: a2, b 3, 4x, anebo to znamená chybu?
2. Může se prvek složený jen z číslic vyskytnout (ve výsledku) uvnitř závorky, anebo by to znamenalo začátek další sekvence? např. zadání č, čp, č, pč se má převést na č(čp, č, pč) anebo č(čp) / č(pč)?
3. Chcete ty alfanumerické prvky nějak normalizovat, např. aby ve výsledku byla vždy nejdřív písmena, pak čísla?

A nebo kteroukoliv tuto kombinaci 2*oddělenou znakem / (např. č / p-č)
4. Takže oba tyto zápisy jsou povolené a dají stejný výsledek? č, pč, pč / č, čp, pč, pč -- vs. -- č / pč / pč // č / čp / pč / pč?
Jcas
Profil *
Ty závorky asi matou. Asi jsem to napsal blbě. Chtěl jsem napsat, že nevím co tam bude, ale závorka a znaky uvnitř tam nikdy nejsou.
10-2 / 15-K nebo S1536 nebo 1536S nebo 10-2 / 64-15 nebo C11-1 / S158

To co mi dělá problém při řazení je, když někdo dá mezera/mezera a někdo jiný ty mezery vynechá.
Stejně tak dělají neplechu přidané nebo nepřidané mezery u "-", případně mezera mezi písmenem a číslem.
Tori
Profil
Jcas:
Aha, tak potom jsem závorky nepochopila.
10-2 / 15-K nebo S1536 nebo 1536S nebo 10-2 / 64-15 nebo C11-1 / S158
Jaký z tohoto chcete dostat výstup? 102 / 15K nebo S1536 nebo 1536S nebo 102 / 6415 nebo C111 / S158 ? aha, to už asi je výstup, že?


A nestačilo by teda tohle?
$vstup = 'retezec od uzivatele';
$vstup = str_replace(' ', '', $vstup);
$vstup = str_replace('/', ' / ', $vstup);
A potom na validaci třeba tohle:
if (!preg_match('~^[\\pL\\d-]+(?: / [\\pL\\d-]+)?$~u', $vstup)) { /* pokud jsou povolena pismena s diakritikou */
// if (!preg_match('~^[a-z\\d-]+(?: / [a-z\\d-]+)?$~i', $vstup)) { /* pismena musi byt bez diakritiky */
    echo 'chybny format';
}
Jcas
Profil *
Výstup stejný, jako případy, které jsem napsal. Já potřebuji, aby to každý uživatel zadal stejně.
Nyní mi jeden zadá 10-2 / 15-K a druhý mi zadá 10-2/16-K.
A místo toho, aby ty tyto dva výsledky byli ihned za sebou, tak mi třeba odskočí od sebe o několik řádků.

Teď mě ještě napadlo, že to stejně tak může pokazit, když jeden zadá 15-K a druhý zapomene na pomlčku a zadá 16K.

Jak to tak vidím, budu to muset ještě rozseknout dle dalšího tagu-select.
Je to značení králíků (tetování), drůbeže a holubů.

Králík:
Levé ucho: Žádné písmeno. "C" tam sice je, ale je to zbytečné. Buď ho budou mít všichni nebo nikdo.
10-2 = říjen-2012.
Takže toto naprosto standartní zápis číslo(1-12)-rok v desetiletí
Pravé ucho:
15-64 nebo č-p nebo p-č (jiná možnost není)

Holuby a drůbež
mezeru uvnitř řetězce nahradíme znakem - a jinak to bude pouze sekvence čísel a písmen.
např. CZ-10-15-1254 nebo 1547-S
Tori
Profil
Jcas:
Jak to tak vidím, budu to muset ještě rozseknout dle dalšího tagu-select
A nemáte tam už nějaký jiný prvek, který byste na to mohl využít (např. výběr druhu/rasy zvířete)?

Anebo by to šlo rozlišovat takhle:
pokud řetězec obsahuje lomítko: 
   je to králík
   doleva od lomítka je levé ucho
      pokud neobsahuje pomlčku:
         doplním pomlčku před poslední znak
   doprava od lomítka je pravé ucho
jinak:
   je to drůbež nebo holub
   všechno co není číslo nebo písmeno (libovolný počet) nahradím jednou pomlčkou
A pak můžete ještě opravit zadání 16K na 16-K, nebo CZ10 na CZ-10 (preg_replace).
Vím, že jste tu už řešil databázi jednou, ale už nepamatuju, jak tam tyhle kódy vlastně ukládáte, jestli vždy oddělujete písmena od číslic nebo ne.
Jcas
Profil *
V db mám na to jednu jedinou buňku a mám to tam jako varchar.

To rozlišování dle "obsahuje /" je dobré. Taky mě napadá, že bych to mohl jednoduše:
1. rozdělit string do pole dle '/'
2. odstranit bílé znaky na koncích
3. nahradit bílé znaky uprostřed za "-"
4. vyměnit malá písmena za velká
5. pole[0]. / .pole[1]

A ještě někde odstranit "C"
A ani bych možná nepotřeboval reg.v.


Jo a to třídění dělám tak, že si vezmu odzadu poslední celé číslo a dle toho to řadím
peta
Profil
Jcas:
Ja bych to tez resil tak, ze kazdy druh ma svuj vlastni kod a ten bych kontroloval zvlast.

10-2 / 15-K nebo S1536 nebo 1536S nebo 10-2 / 64-15 nebo C11-1 / S158
1. odstranit zakazane znaky: '~[^\d\w\\/\\-]~'
Tim to omezis jen na cisla, pismena, minus, lomeno. Pak nezalezi na tom, kolik mezer tam uzivatel da
2. nahradit vsechny zdvojene oddelovace '~([\\/\\-])+~', '$1'
3. zkontrolovat validnost kodu, preg_match
C11-1 / S158
\w\d{2}\-\d\/\w\d{3} // mozna lomitka zdvojit pro reg. vyraz

<?php
$str = "C 11 -- 1 // S 158 ,.(*";  // C11-1 / S158 + znaky navic
echo $str."<br>";
$str = preg_replace('~[^\d\w\\/\\-]~','',$str);
$str = preg_replace('~([\\/\\-])+~','$1',$str);
echo $str."<br>";
?>
Jenze, kdyz uzivateli neco umazes, tak bys mu mel ukazat i vysledek po ulozeni, kde ho upozornis, se kterym udajem si manipuloval, aby mel jistotu, ze je to ok.
Jcas
Profil *
Ty zdvojené \ nechápu.
Chápu, že pro znaky / a - musím dát obr.lom. aby byly chápány jako normální znaky a ne významové. Tedy
\/ a \-
Ale proč dvě?
Jan Tvrdík
Profil
Jcas:
Protože zpětné lomítko má zvláštní význam nejen v regulárních výrazech, ale i v PHP řetězcích. Vzhledem k použití apostrofů ale stačí uvést lomítko jedno.
Jcas
Profil *
Po chvilce hraní jsem se dostal k tomu to výsledku. To se už chová velice dobře.
Poslední co by stálo ještě za to, tak strčit mezi písmeno a číslo pomlčku.

Pokud uživatel zadá S153, tak z toho udělat S-153

function upravstring($str) {
    $str = strtoupper($str);        //převod malých na velký
    $str = preg_replace('~[^\d\w\\-\h]~','',$str);    //odstranění nepovolených znaků
    $str = trim($str);            //odstranění bílých znaků na koncích
    $str = str_replace(' ', '-', $str);    //výměna mezer za -
    $str = preg_replace('~([\\-])+~','$1', $str); //odstranění zdvojených - 
    return $str; 
    }

$str = "S1568";  // C11-1 / S158 + znaky navic
echo $str."<br>";

if($kralik=true) {
    substr_count($str, '/')!=1?$hlaska='chybablabla':$pole=explode('/', $str);
    $pole[0] = preg_replace('~[^\d\\-]~', '', $pole[0]); // odstranění C
    $str = upravstring($pole[0]).' / '.upravstring($pole[1]);
    }
    else {$str = upravstring($str);}
echo $str."<br>";
echo $hlaska."<br>";
Tori
Profil
Jcas:
Pozor, na ř.13 máte přiřazení místo porovnání.
Pomlčku mezi čísla a nečísla písmena (kdekoli uvnitř řetězce) vložíte např. takto: preg_replace('~(?<=\d)(?=\pL)|(?<=\pL)(?=\d)~u', '-', $string);
Vzhledem k tomu, že \h bere kromě mezery i tabulátor, by šlo řádky 5+6 spojit dohromady: $str = preg_replace('~\h+~', '-', $str);
K odstranění písmene C zleva by stačilo i ltrim s druhým parametrem.
Pokud králík a pokud bude víc/míň než jedno lomítko, tak řádky 15+16 budou dělat něco úplně jiného. Dala bych je asi do podmínky. Kdybyste to chtěl flexibilní pro n lomítek v řetězci, šlo by to i takto:
if ($kralik) {
    if (strpos($str, '/') !== false) {
        $tmp = explode('/', ltrim($str, "Cc \n\r\t"));
        $str = implode('/', array_map('upravstring', $tmp));
    } else {
        $hlaska = 'chyba...';
} else {
    $str = upravstring($str);
}
edit: opraveno vkládání pomlček.
peta
Profil
'~(\d)(\w)|(\w)(\d)~' nahrad za '$1-$2'
http://www.regexp.cz/
Co je \h? Pokud \h ma byt h, pak ta lomitko nemusi byt.
\\/ ... '\'' apostrof, '\\' zpetne lomitko ve stringu
\/ ... lomitko pro reg. vyraz, jenze, protoze je to php string, tak se lomitko zalomitkovava; jen si nejsem jisty, jestli jsou pravidla odlisna pro "..." a '...', mozna to neni treba zalomitkovavat. ja sazim na jistotu. Pise se tam, ze zalomitkovani navic nevadi.

Tori:
(?<=\d)(?=\D)
\D je jakykoliv znak, krome cisla. A co kdyz ten znak bude pomlcka nebo lomitko?
Tori
Profil
peta:
Dík za opravu.
Jan Tvrdík
Profil
peta:
Co je \h?
RTFM
peta
Profil
Dik. any horizontal whitespace character (since PHP 5.2.4). Mezi nama, to je vysvetleni na 2 pikacu :) Hned bych mohl polozit otazku a ktery je to znak v ascii tabulce? Ale vicmene mne to dal nezajima, asi to nikdy nevyuziji.
Jcas
Profil *
Perfektní. Děkuju mockrát

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: