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.
Člen
Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí HTML a CSS, jsme si ověřili nabyté zkušenosti z kurzu.
A co použít a-žA-Ž?
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ě ) nikde neuvádí. Teď jsem vyzkoušel, že se dá použít i kratší varianta A-ž
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...
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.
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 '
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á.
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)
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)
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í.
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.
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-Ž
Zobrazeno 12 zpráv z 12.