Autor | Zpráva | ||
---|---|---|---|
Jcas Profil * |
#1 · Zasláno: 17. 1. 2013, 07:18:54
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 * |
#3 · Zasláno: 17. 1. 2013, 10:02:23
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“ 102 / 15K nebo S1536 nebo 1536S nebo 102 / 6415 nebo C111 / S158 ?A nestačilo by teda tohle? $vstup = 'retezec od uzivatele'; $vstup = str_replace(' ', '', $vstup); $vstup = str_replace('/', ' / ', $vstup); 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 * |
#5 · Zasláno: 17. 1. 2013, 10:46:17
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 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 * |
#7 · Zasláno: 17. 1. 2013, 11:28:09 · Upravil/a: Jcas
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>"; ?> |
||
Jcas Profil * |
#9 · Zasláno: 17. 1. 2013, 14:31:36
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 |
#10 · Zasláno: 17. 1. 2013, 14:37:52
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 * |
#11 · Zasláno: 17. 1. 2013, 16:43:37
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 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); } |
||
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 |
#14 · Zasláno: 18. 1. 2013, 09:00:49
peta:
Dík za opravu. |
||
Jan Tvrdík Profil |
#15 · Zasláno: 18. 1. 2013, 10:05:56
|
||
peta Profil |
#16 · Zasláno: 18. 1. 2013, 14:46:07
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 * |
#17 · Zasláno: 18. 1. 2013, 15:45:52
Perfektní. Děkuju mockrát
|
||
Časová prodleva: 11 let
|
0