IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Regular Expression - validace textového inputu

V předchozím kvízu, Online test znalostí HTML a CSS, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Libor Sitek
Člen
Avatar
Libor Sitek:30.10.2017 23:49

Ahojte,
tak jsem si chtěl upravit pár údajů tady v mém profilu, ale nové údaje mi nešli uložit, protože se validace zasekne na položce "Jméno", kde mám nastavenou hodnotu "Libor Sitek" už od registrace a kterou jsem ani nechtěl změnit. Při pokusu o uložení mi u této položky vyskočí jen "Je nutné použít tento formát:". Kouknul jsem na zdrojový kód stránky a pro validaci vstupu je použit tento RegExp:

pattern="<stron­g>^[\p{L}\s'\­.\-0-9]{4,32}$</strong>"

Snažil jsem se tento výraz rozluštit, pochopil jsem z toho toto:

{4,32} vstup musí obsahovat 4 až 32 znaků, povolené znaky:
0-9 číslice
\- pomlčka
\. tečka
' jednoduchá uvozovka
\s bílý znak (mezera)
\p{L} Unicode písmeno

Teoreticky by neměl být žádný problém s hodnotou "Libor Sitek", ale hádám, že můj prohlížeč (Edge) asi nepodporuje poslední uvedený výraz pro Unicode písmeno. Zkoušel jsem totiž tento výraz nahradit výrazem a-zA-z, kdy to Edge pustí, ale zase jen vstupy neobsahující českou diakritiku...

Odpovědět
30.10.2017 23:49
Když se chce, hledá se jak, když se nechce, hledá se proč
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Libor Sitek
Jan Lupčík:31.10.2017 8:14

A co použít a-žA-Ž? :)

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
31.10.2017 8:14
TruckersMP vývojář
Avatar
Libor Sitek
Člen
Avatar
Odpovídá na Jan Lupčík
Libor Sitek:31.10.2017 9:23

Jo, funguje to! Nevěděl jsem že se dá použít i tento český ekvivalent, na anglických stránkách o RegExp se tento výraz (překvapivě :-D ) nikde neuvádí. Teď jsem vyzkoušel, že se dá použít i kratší varianta A-ž

Nahoru Odpovědět
31.10.2017 9:23
Když se chce, hledá se jak, když se nechce, hledá se proč
Avatar
Libor Sitek
Člen
Avatar
Odpovídá na Libor Sitek
Libor Sitek:31.10.2017 10:48

Stáhl jsem si Chrome a zkusil upravit údaje v Chromu, šlo to bez problému, takže závada je opravdu na straně prohlížeče. Začínám chápat, proč lidi stahují a používají jiné prohlížeče než ty, které jsou v základu ve Windowsech...

Nahoru Odpovědět
31.10.2017 10:48
Když se chce, hledá se jak, když se nechce, hledá se proč
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Libor Sitek
Jan Lupčík:31.10.2017 16:02

Tuším, že by také šlo pouze a-ž. S tím mi také fungovaly velká písmena.
Nicméně jsem rád, že už to funguje. A jen tak mezi námi - já osobně jsem se už vykašlal na podporu IE/Edge. ;)

Nahoru Odpovědět
31.10.2017 16:02
TruckersMP vývojář
Avatar
Jan Kostelník:1.2.2022 10:02

Ahoj.
Navážu na toto starší vláknou řešící podobnou záležitost a požádal bych o pomoc. Jak byste řešili tohle vy?
Chtěl bych nechat projít zadáním třeba takovýto text: 'Sgduyi O'Cfgfiyf & dfgdghdrhd - pročšěěšříéťö', který může obsahovat znaky od a-Ž (včetně zahraničních diakritik), kromě čísel a těchto znaků: '?§()@#$%^*_\' . Oddělovat jednotlivá slova by tedy šlo (samozřejmě na nějaké nepodchycené výjimky) pouze znaky: '<mezera>,-,&'. V regulárních výrazech v PHP/preg_match() jsem nezkušený a tak by snad mohl někdo pomoci.
Já zkoušel např. online tester (Rubular) a tam mi fungovalo toto: '/^[[a-Ž][^\?§\(\)@#­\$%\^*_\\]+[(\-?| ?|'?|\&?)]]*[[a-Ž][^\?§\(\)@#­\$%\^*_\\\-'\"]]$/'
Když to hodím do PHP, tak mi to hlásí chybu: 'Warning: preg_match(): Compilation failed: range out of order in character class at offset 78 '

Nahoru Odpovědět
1.2.2022 10:02
We are not limited by the vast of the possible but by the space inside us!
Avatar
Odpovídá na Jan Kostelník
Jan Kostelník:1.2.2022 10:25

Objevil jsem chybku v tom patternu (jedno zpětné lomítko navíc). Takto to už chybu nehlásí: '/^[[a-Ž][^\?§\(\)@#­\$%\^*_\\]+[(\-?| ?|'?|\&?)]]*[[a-Ž][^\?§\(\)@#­\$%\^*_\\-'\" ]]$/', ale stále to asi ve formuláři nefunguje, jak má.

Nahoru Odpovědět
1.2.2022 10:25
We are not limited by the vast of the possible but by the space inside us!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1.2.2022 16:01

Jan Kostelník - nenavazuj na starsi vlakno, zaloz si nove. Novy problem, nove vlakno. Pridej tam treba link na to stare. Ted je to tu poznacene jako vyresene a spousta lidi na takove tema uz neklika :) Pak si tu muzes psat, co chces, ze? :)

"včetně zahraničních diakritik" - musis mit kodovani obsahu souboru jako utf-8 (html, js), a tez mozna v zahlavi html utf-8
PS. Bavi se tu o javascriptu ne php, jestli chapu ten prvni dotaz spravne.

Compilation failed: range out of order in character class at offset 78 '
[a-Ž] - php takovy vyraz nejspis nezna? neni to standadizovany zapis podle norem pro preg_match
php.net/preg_match
https://www.php.net/…n.syntax.php
https://www.php.net/…-classes.php
Ja si myslim, ze by mohlo jit pouzit nektere z tech classes pro php. Ale opet musis mit kodovani v utf. A nemam to vyzkousene. alpha, alnum, print...
Examplu je tam minimum, takze ten manual je v mnohem k nicemu ohledne regexp, jak zjistuji :) Ale tak googlem, snad, nasel jsem nejake pouziti tech classu.

/[a-fA-F0-9]/
/[[:xdigit:]]/

Vzdycky ale muzes ty znaky vsechny vyjmenovat. Pouziva se to casto treba k odstraneni diakritiky pro jmena souboru, protoze spousta programu neumi diakritiku, stale jeste :)
Nicmene, v dokumentaci najdes v jednom komentari i tento zajimavy link
https://www.regular-expressions.info/unicode.html
\p{L} any kind of letter from any language. (bohuzel nevim, jestli se to takhle da zapsat i pro preg_match)

Editováno 1.2.2022 16:02
 
Nahoru Odpovědět
1.2.2022 16:01
Avatar
Odpovídá na Peter Mlich
Jan Kostelník:1.2.2022 16:33

Díky za rady a já se mezitím trochu do toho položil. Sice se mi nepodařilo ošetřit všechny znaky, ale pro nějakou základní funkčnost mi to zatím stačí. Zkusím pak ještě dopátrat, jak by se to dalo doladit. A nakonec to nevypadá až tak zle a odzoušel jsem to na standardních klávesových znacích.
preg_match("/^[[a-zA-Ž '-]+[^;]]*[a-zA-Ž]$/u",$string)

Nahoru Odpovědět
1.2.2022 16:33
We are not limited by the vast of the possible but by the space inside us!
Avatar
Jan Kostelník:1.2.2022 16:51

Přeci jen ještě jeden dotaz. Ošetřil jsem si i '&', protože jsem si neuvědomil, že ten $string už mám ošetřený 'htmlspecialchars', takže stačilo doplnit jen '(&)'. Ale nedaří se zakázat některé znaky, ale spíš asi nějakou chybou syntaxe, než znaků. Ty znaky jsou standardní i po htmlspecialchars.
**Nevidíte někdo tu chybu, proč to bere z podmínky nechtěných znaků vždy jen první znak? V tomto případě '?'. **
preg_match("/^[[a-zA-Ž (&)'-]+[^\?;§\(\)@­\$\^*¤_]]*[a-zA-Ž]$/u",$string)

Pak už bych ten výsledek bral jako vyhovující.

Nahoru Odpovědět
1.2.2022 16:51
We are not limited by the vast of the possible but by the space inside us!
Avatar
Odpovídá na Jan Kostelník
Jan Kostelník:1.2.2022 17:22

Takže ono to bralo nějaké zakázané znaky už z toho, že nejsou povolené, takže jsem se mylně domníval, že když je přehodím, pak to funguje. Ale ono to prostě nechce vůbec zakázat např. tyto znaky: '_', '§', '¤'.
Když do toho samého výrazu dám ale nějaké písmenko, tak to vyhodnotí správně. To bude fakt asi nějaký problém s kódováním, nebo něco takového. Kódování mám vše v UTF-8.
Výsledný řetězec, kde stejně nefunguje zakázat některé znaky je tedy takovýto:
preg_match("/^[[a-zA-Ž (&)'-]+[^_§¤]]*[a-zA-Ž]$/u",$string)
Tak jen kdyby někoho napadlo a přišle na to, jak to dotáhnout do konce...
Díky a sorry za tolik příspěvků ohledně této věci.

Nahoru Odpovědět
1.2.2022 17:22
We are not limited by the vast of the possible but by the space inside us!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:2.2.2022 8:31

Cim vic se v tom hrabu, tim vic zjistuji, ze php.net ohledne regularu stoji za prd :)
Pokud je se znakem problem, univerzalni je pouziti unicode kodu. \x{309F}
php.net/preg_match

44 --- ruakuu at NOSPAM dot com --- 12 years ago
<?php
$pattern ='/^[-a-zA-Z0-9_\x{30A0}-\x{30FF}'
         .'\x{3040}-\x{309F}\x{4E00}-\x{9FBF}\s]*$/u';
$match_string = '印刷最安 ニキビ跡除去 ゲームボーイ';

if (preg_match($pattern, $match_string)) {
    echo "Found - pattern $pattern";
} else {
    echo "Not found - pattern $pattern";
}
?>

https://www.php.net/…-replace.php
723 --- arkani at iol dot pt ---12 years ago
Ma tam peknou tabulku zakladnich predpisu.

google = php preg_replace unicode character
https://stackoverflow.com/…oblem-in-php

$result = "bei einer Temperatur, die etwa 20 bis 60°C unterhalb des Schmelzpunktes der kristallinen Modifikation"
$result = preg_replace('/\x{00B0}/u'," degrees ", $result );

https://tipsfordev.com/…-in-a-string


A ta druha otazka, to bys musel dat priklad.
preg_replace: vstup, vyraz, predpokladany vystup.
preg_match: vstup, vyraz, jaky text mel byt vybran.
https://www.php.net/…nce.meta.php
Nektere znaky vyzaduji escapovani.


"/^[[a-zA-Ž (&)'-]+[^_§¤]]*[a-zA-Ž]$/u" Ta konstrukce se mi nezda. Jak muzes pouzit [[ ]] ?
"/^([a-zA-Ž (&)'-]+[^_§¤])*[a-zA-Ž]$/u" Takhle by to davalo vetsi smysl
a-zA-Ž Proc tam mas a-z ale A-Ž? Jakoze Jan Lupcik tam pise o a-žA-Ž

Editováno 2.2.2022 8:32
 
Nahoru Odpovědět
2.2.2022 8:31
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.