Autor Zpráva
RadeKrtek
Profil *
Ahoj, mám toto:
$prvni = ereg(' {2,}', $text);
$druhy = ereg('[^A-Za-z0-9_ ]', $text);
ten první testuje zda se v tectu nachází dvě a více mezer zasebou a ten druhý zda se řetězec skládá jen z číslic, písmen, podtržítka a mezery.
1) mám to dobře napsané? já regulárním výrazům absolutně nerozumím, tohle sem vytvořil čistě náhodou pokus, omyl
2) jak ty dva spojit do jednoho?


zkoušel jsem tohle ale nefunguje to:
$druhy = ereg(' {2,}[^A-Za-z0-9_ ]', $text);
Kajman
Profil
Chcete NEBO nebo A? Proč nesmí zůstat výrazy samostatně?
RadeKrtek
Profil *
chtěl bych "A", mohli by, když nad tim tak přemýšlím, ale do budoucna bych chtěl vědět jak na to
Radek9
Profil
RadeKrtek:
1) Pro starou verzi PHP je to akceptovatelné, ale od PHP verze 7.0.0 již ereg funkce neexistují. Měl bys místo toho použít funkci preg_match. Pokud jde o ten druhý regulár, tak to, co jsi popsal, odpovídá negaci toho tvého výrazu. Takže by to správně mělo být buď takto:
$prvni = preg_match('/ {2,}/', $text);
$druhy = preg_match('/[^A-Za-z0-9_ ]/', $text);
if ($prvni && !$druhy) {
  // splněno
}
Nebo takto:
$prvni = preg_match('/ {2,}/', $text);
$druhy = preg_match('/^[A-Za-z0-9_ ]*$/', $text);
if ($prvni && $druhy) {
  // splněno
}

2) Spojit je do jednoho (pokud tedy skutečně chceš, aby platily obě podmínky) můžeš třeba takto:
if (preg_match('/^[A-Za-z0-9_ ]* {2,}[A-Za-z0-9_ ]*$/', $text)) {
  // splněno
}
RadeKrtek
Profil *
a když bych tam chtěl ještě přihodit znaky []() tak to musím odescapovat, ale to pak nebude fungovat
$druhy = ereg('[^A-Za-z0-9_ \]\[\(\)]', $text);
jak to mám zapsat? Díky


aha, s tim preg match to už funguje... díky
Radek9
Profil
RadeKrtek:
Proč by to nemělo fungovat?

Edit: S ereg funkcemi nemám až takové zkušenosti, možná se to tam dělá jinak. Ale od verze 5.3.0 jsou zastaralé a od verze 7.0.0 neexistují. Nepoužívej je.
RadeKrtek
Profil *
ale ještě jedna věc... jak mám odstranit znaky jako tabulátor?


a nemusí to být pomocí regulerních výrazů, prostě jak odstranit tabulátory a další netisknutelný znaky krom bílích znaků... s tim preg_match to už funguje.... asi sem s tim erege dělal něco špatně.
Keeehi
Profil
RadeKrtek:
prostě jak odstranit tabulátory a další netisknutelný znaky krom bílích znak
Tabulátor je ale bílý znak. Myslím že bude jednodušší když nám řekneš co vše má být zachováno a my ti pak napíšeme kód co odstraní vše ostatní.

V zásadě to bude vypadat takto:
$output = preg_replace('~[^vse co ma zustat]+~', '', $input);
RadeKrtek
Profil *
Keeehi:
tyto znaky - mezera, závorky, čísla a písmena od A do Ž
A-Za-z0-9_ ][()
Kajman
Profil
pokud používáte jednobytové kódování (cp1250, iso-8859-2), tak zkuste
preg_replace('~[^A-Za-z0-9_ \\][()ĚŠČŘŽÝÁÍÉÚŮĎŤŇÓěščřžýáíéúůďťňó]+~', '', $input);
pokud utf-8, tak zkuste
preg_replace('~[^A-Za-z0-9_ \\][()ĚŠČŘŽÝÁÍÉÚŮĎŤŇÓěščřžýáíéúůďťňó]+~u', '', $input);
RadeKrtek
Profil *
hm, ale co když chci i od a až do ž, dá se to nějak zapsat kromě vyjmenování všech těch ščřžý,...? preg_match('/[^A-Za-z0-9_ ]/', $text);
Radek9
Profil
RadeKrtek:
dá se to nějak zapsat kromě vyjmenování všech těch ščřžý,...?
Ne. Ty rozsahy v hranatých závorkách (a-z, A-Z a 0-9) jsou vlastně rozsahy v rámci Unicode tabulky (tedy v případě utf-8, u cp1250 a iso-8859-2 by to byla jiná tabulka). A funguje to jenom proto, že jsou ty znaky v tabulce za sebou. Což ale neplatí u znaků s diakritikou, jak se v té tabulce můžeš přesvědčit, protože jsou mezi nimi zamíchané i jiné znaky. Proto je potřeba je explicitně vypsat.
Keeehi
Profil
RadeKrtek:
Ale dá se to udělat. \w popisuje skupinu písmen, čísel a podtržítka. Pokud se do reguláru přidá modifikátor u pak to zvládne i méně běžné písmenné znaky. Takže myslím že by to mohlo vypadat takto:
$output = preg_replace('~[^\w\][()]+~u', '', $input);

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:

0