Autor Zpráva
capricorn76
Profil *
Zdravím,

Struktura tabulek:
1. <table>, <tr>, <td>, <th> obsahují značky, které NEUKLÁDAT
2. alepsoň jedna buňka na RŮZNÉM místě v řádku MUSÍ obsahovat dvě VELKÁ písmena, které ULOŽIT. Pokud neobsahuje, tak nic z toho řádku NEUKLÁDAT
3. povolené znaky buněk: desetinná čísla (oddělovač je,.), čísla a písmena, mezera
4. počet buněk se někdy liší
5. např. <td><p style="..">obsah</td> nebo <th><span ...>obsah</span></th> apod., ULOŽIT obsah, tagy NEUKLÁDAT

Děkuji za pomoc.
Virtus
Profil
Myslím, že pro načtení toho HTML kódu by se dalo použít toto: Document Object Model, a pak už by stačilo jenom nějakým cyklem procházet jednotlivý řádky a dalším cyklem uvnitř, procházet buňky, kde by si přes if a regulár kontroloval, jestli obsah buňky obsahuje dvě velká písmena a když bys zjistil, že obsahuje, rovnou uložíš celej řádek, vyskočíš z cyklu pro procházení buněk a jdeš na další řádek.
if pro kotrnolu dvou velkých písmen by mohl potom vypadat asi takhle:
if(preg_match('/^.*[A-Z]{1}.*[A-Z]{1}.*$/', $obsahBunky))
capricorn76
Profil *
Děkuji.

if(preg_match('/^.*[A-Z]{1}.*[A-Z]{1}.*$/', $obsahBunky))
tohle nefunguje, když mám v $obsahBunky např. <td>AB</td>

Zkusil jsem to změnit na
if(preg_match('/^.*[A-Z]{}.*$/', $obsahBunky))
ale to také nefunguje

.*
pokud to dobře chápu, tak tohle bere <td> i <th>
Virtus
Profil
.* tohle je regulérní výraz pro jaký koliv string a to i prázdný
tečka = jakej koliv znak
hvězdička = že těch znaků může být nula až nekonečno
A příde mi divný, že Vám ten můj regulár nefunguje na AB, testoval jsem ho tady: preg_match() online a AB řetězec mi prošel, zkuste si vypsat obsah té proměnné $obsahBunky, jestli v ní opravdu máte string AB
Jan Tvrdík
Profil
capricorn76:
Ověření, že daný řetězec obsahuje alespoň dvě velká písmena:
$s = 'fooAbarB';
$valid = (bool) preg_match('#(?:[A-Z].*){2}#', $s);
var_dump($valid);
capricorn76
Profil *
Virtus: Jan Tvrdík:

zkuste si vypsat obsah té proměnné
proměnná obsahuje <td>nějaký obsah</td> tedy projde i 'fooAbarB', což je špatně, protože jsem prvotní příspěvek napsal špatně. I když $obsahBunky bude 'fooAbarB', tak to musí být false, i když řetězec obsahuje 2 velká písmena a ostatní jsou malá.
Chci jen řádky kde jsou pouze 2 velká písmena, t.j.
'fooAbarB' = false,
'DS' = true

zkusil jsem tedy, aby to bralo <tag>
if(preg_match('/^<.*?[A-Z]{2}.*?>$/', $obsahBunky))
ale pořád to není ono
Virtus
Profil
if(preg_match('/^\<td\>([A-Z]{2})\<\/td\>$/', $obsahBunky, $match ))
//v $match[1] budu mít jenom ty dvě velká písmena, pokud Vám jde pouze o ně
capricorn76
Profil *
Virtus:
v $match[1] budu mít jenom ty dvě velká písmena, pokud Vám jde pouze o ně
nejde mně o $match[1], ale potřebuji upravit
if(preg_match('/^<.*?[A-Z]{2}.*?>$/', $obsahBunky))
aby podmínka se vyhodnocovala takto
<td>'fooAbarB</td> = false
<th>'fooAbarB</th> = false
<td>BC</td> = true
<th>FC</th> = true
Virtus
Profil
preg_match('/^\<(t|T){1}(d|D|h|H){1}\>[A-Z]{2}\<\/(t|T){1}(d|D|h|H){1}\>$/', $obsahBunky)
Projde tím ovšem i něco takového: <td>AB</th>


Tady v tom případě, už projdou striktně jenom:
preg_match('/^\<((t|T){1}(d|D){1}\>([A-Z]{2})\<\/(t|T){1}(d|D){1}|(t|T){1}(h|H){1}\>([A-Z]{2})\<\/(t|T){1}(h|H){1})\>$/', $obsahBunky);
<td>AB</td>
<th>AB</th>
<td>AB</th> neprojde

A pokud jste si jistý, že vždy budete mít tagy s malými písmeny, tj. <td><th>, můžete ten regulár zkrátit na tohle:
preg_match('/^\<(td\>([A-Z]{2})\<\/td|th\>([A-Z]{2})\<\/th)\>$/', $obsahBunky);
capricorn76
Profil *
Virtus:
preg_match('/^\<(td\>([A-Z]{2})\<\/td|th\>([A-Z]{2})\<\/th)\>$/', $obsahBunky);
Skvělé, ale nefunguje to, když buňky mají class, style apod.
Virtus
Profil
Tak přidáme malou úpravu s .*:
preg_match('/^\<(td.*\>([A-Z]{2})\<\/td|th.*\>([A-Z]{2})\<\/th)\>$/', $obsahBunky);
capricorn76
Profil *
Virtus:
Super, děkuji.
capricorn76
Profil *
Virtus:

potřeboval bych ještě prosím upravit ten regulár, aby fungoval kdekoli v řádku, protože teď funguje jen jako první. Děkuji.
Virtus
Profil
tak opět přidáme .*, na kraje celého reguláru:
preg_match('/^.*(\<(td.*\>([A-Z]{2})\<\/td|th.*\>([A-Z]{2})\<\/th)\>).*$/', $obsahBunky);
capricorn76
Profil *
Virtus:

Děkuji, ještě bych potřeboval doplnit bílé znaky na začátku, uprostřed, na konci.
Virtus
Profil
\s = "bílé" znaky (mezera, tabulátor, znaky pro zalomení řádků)
preg_match('/^.*(\<(td.*\>\s*[A-Z]{1}\s*[A-Z]{1}\s*\<\/td|th.*\>\s*[A-Z]{1}\s*[A-Z]{1}\s*\<\/th)\>).*$/', $obsahBunky);
Př. které projdou:
1)<td> AB</td>
2)<td>AB
</td>
3)<td>
AB
</td>
4)<td> A B </td>
5)<td>AB</td>
Tady: Regulární výrazy, jsou česky popsané základy regulárních výrazu, pomocí nich se dá udělat všechno, nenapadá mně žádný řetězec který by snimi(se základy) nešel popsat. Další informace i trochu složitější věci pak najdete v článcích na interval.cz

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: