Hirdetés

2024. május 3., péntek

Gyorskeresés

Útvonal

Fórumok  »  Szoftverfejlesztés  »  PHP programozás (kiemelt téma)

Hozzászólások

(#11551) Lacces


Lacces
őstag

Hello!

Van valami bevált módszer, ami tényleg működik is, és arról leírás :), hogy hogyan kell egy szövegből kiszedni az összes html cuccót?
szöveg,<input" style="width:350px" maxlength="90" /> valami szöveg még <p> még szöveg </p>
Na, innen minden html tagot ki kellene szedni, de hiába regexpezek még... eddig nem jártam sikerrel.

(#11552) sztanozs válasza Lacces (#11551) üzenetére


sztanozs
veterán

Ezt találtam :
</?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)/?>

[ Szerkesztve ]

JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...

(#11553) Soak válasza Lacces (#11551) üzenetére


Soak
veterán

(#11554) Lacces válasza sztanozs (#11552) üzenetére


Lacces
őstag

Tanulnom kell majd a regexpeket... :) Köszi. :R
Soak: Jaja, közben én is megtaláltam és bevált. :R

(#11555) Lacces


Lacces
őstag

Lenne még egy kérdésem:
Mintaillesztéssel kapcsolatban, a legutolsó variácót dobom ide...
Adott egy html szöveg, ahol a hiperhivatkozásokat kellene úgymond cserélni... de egyelőre a megtalálása sem megy.
$content a szöveg amin végig megy.
$links amibe gyűjteném.
preg_match_all() - itt a minta már a sokadik, már keresgélek... kínomban.
function LinksReplace( $content )
{
$links = null;
// Linkek keresése az eredeti tartalomban
preg_match_all("|<a[^>]+href\=\"(http\:\/\/.*)\"[^>]*>.*</a>|U", $content, $match, PREG_SET_ORDER );
var_dump($match);
foreach( $match as $m )
{
$links[] = $m;
}
return $links;
}

próbálgattam $m[1] és a társaival sem, de nem jött össze. Meg más mintákkal is.
Valakinek valami ötlet?

(#11556) Sk8erPeter válasza Lacces (#11555) üzenetére


Sk8erPeter
nagyúr

[link]

Sk8erPeter

(#11557) mobal válasza Sk8erPeter (#11547) üzenetére


mobal
MODERÁTOR

József a főgonosz! :DDD

"Ott szimatol a sarkadban vasfogait csattogtatva, minden egyes hétköznapod: kirúzsozott medvecsapda."

(#11558) Lacces válasza Sk8erPeter (#11556) üzenetére


Lacces
őstag

köszi, amúgy érdekes nekem '/' helyett '#'-el működött rendesen. :R

(#11559) Lacces


Lacces
őstag

Adott a következő kód, lekérdezés az adatbázisból:

$r = APP::Loader( 'db' )->Query( $q ); // ez a queryt lekérdezi jó

while ( $a = mysql_fetch_assoc( $r ) )
//while ( $a = APP::Loader( 'db' )->Fetch_Assoc( $r ) )
{
$datas[$a['label_description']] = $a['l_id'];
}
echo 'r: ';var_dump($r); echo '<br>';
echo 'a: ';var_dump($a); echo '<br>';
echo 'datas: ';var_dump($datas);echo '<br>';
return $datas;

Az a baj, hogy az $a az egy false... pedig $r-nek van értéke.
PhpMyAdmin-ban a lekérdezés jó, visszajön eredménnyel. Ilyennel még nem találkoztam az eredménynél:
r: resource(52) of type (mysql result)
a: bool(false)
datas: NULL

Mi lehet itt a gond? Miért nem jó? Miért nem tudja kiszedni az infókat?

(#11560) Peter Kiss válasza Lacces (#11559) üzenetére


Peter Kiss
senior tag
LOGOUT blog

Mi az App::Loader(string)?
Mi a ->Query(??)?
Mi a $q?

A kiírt cuccok helyesek, ha semmi sem jön vissza.

Valamiért úgy érzem, sz.r került a palacsintába. :DDD

(#11561) Sk8erPeter válasza Lacces (#11559) üzenetére


Sk8erPeter
nagyúr

Tényleg nem sokat árultál el a szerkezetről, ahogy Athlon64+ hsz.-éből is kiderül. :)

"Ilyennel még nem találkoztam az eredménynél:
r: resource(52) of type (mysql result)
a: bool(false)
datas: NULL
"

Az $r értelemszerűen egy erőforrás-azonosító, az $a-nak a false visszatérési értéke meg gondolom jelzi, hogy valami gáz van, a $datas meg ebből következően üres.
Csak jelzem, hogy a data (adatok) eleve többesszám, nem kell mögétenni az "s"-t. :)

Sk8erPeter

(#11562) Lacces válasza Peter Kiss (#11560) üzenetére


Lacces
őstag

Bízz bennem az a rész jó.
Sk8erPeter Nem lehet valahogy több infót kiszedni, hogy mi a gáz?
(ha legalább adatbázisban nem működne a lekérdezés... plusz egy teljesen jó lekérdezést is lemásoltam, csak a queryString-et változtattam meg... de ugyanúgy semmi eredmény.
Meg engem az 'a' értéke érdekel, hogy miért az...

Átírtam az egész lekrédezést mysqli-re és pdo-ra.
mysqli kód:
$q = "SELECT `scms_ws_label`.`label_description` as `label_description`,`scms_ws_label`.`label_id` as `l_id`
FROM `scms_ws_label`
WHERE `scms_ws_label`.`label_cat` = 'Main_Absatzhöhe' ORDER BY `scms_ws_label`.`label_description`";


$DB_NAME = 'cipoplaza_bettle';
$DB_HOST = 'localhost';
$DB_USER = 'bettle';
$DB_PASS = 'KKsh3c7W6T6Fb46N';
$mysqli = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);

$r = $mysqli->query($q);

while ( $a = $r->fetch_assoc() )
{
$datas[$a['label_description']] = $a['l_id'];
}

mysqli kimenete:
r: object(mysqli_result)#16 (0) { }
a: NULL
datas: NULL

Pdo kód:
$q = "SELECT `scms_ws_label`.`label_description` as `label_description`,`scms_ws_label`.`label_id` as `l_id`
FROM `scms_ws_label`
WHERE `scms_ws_label`.`label_cat` = 'Main_Absatzhöhe' ORDER BY `scms_ws_label`.`label_description`";

$db = new PDO('mysql:host=localhost;dbname=titkos;charset=utf8', 'titkos', 'titkos');
$stmt = $db->query($q);

while ( $a = $stmt->fetch(PDO::FETCH_ASSOC) )
{
$datas[$a['label_description']] = $a['l_id'];
}

Kimenete:
$stmt: object(PDOStatement)#16 (1) { ["queryString"]=> string(231) "SELECT `scms_ws_label`.`label_description` as `label_description`,`scms_ws_label`.`label_id` as `l_id` FROM `scms_ws_label` WHERE `scms_ws_label`.`label_cat` = 'Main_Absatzhöhe' ORDER BY `scms_ws_label`.`label_description`" }
a: bool(false)
datas: NULL

[ Szerkesztve ]

(#11563) Sk8erPeter válasza Lacces (#11562) üzenetére


Sk8erPeter
nagyúr

Miért label_description szerint rendezed a tömböt, miért nem id szerint?
Amúgy a $data tömböt kéne még deklarálni a ciklus előtt, bár nem mintha pont ez lenne a baj.
$data = array();
while(...){
$data[] = ....;
}

állítsd kivételdobálásra a PDO-t:
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Van még ilyen is: errorInfo

Az eredményhalmazon egyébként foreach-csel is végig lehet rohangászni, és érdemes is, ha már támogatja az ilyen jellegű iterációt:

foreach ($stmt as $key => $row) {
// ....
}

Sk8erPeter

(#11564) Lacces válasza Sk8erPeter (#11563) üzenetére


Lacces
őstag

Látom, semmi sem kerüli el a tekintetedet... $data stb, azok megvannak :) csak máshol...
Azt az error-t meglesem.

Igen a foreach, csak ha c++-os kódokat is nézek / tanulok, akkor hajlamos vagyok elfelejteni a foreach-et :)

(#11565) Peter Kiss válasza Lacces (#11562) üzenetére


Peter Kiss
senior tag
LOGOUT blog

Tesztelés közben is keverted a mysql-t és a mysqli-t, illetve aki így static-kol, abban nem bízunk.

(#11566) syC


syC
addikt

Sziasztok.

Egy kis ötletre lenne szükségem. Egy hosszú php kérést futtatok és szeretnék közben valahogyan kiíratni információkat a futás állapotától függően. Tanácsot szeretnék kérni, hogy Ki mivel oldaná meg.

Előre is köszi a válaszokat!

(#11567) Soak válasza syC (#11566) üzenetére


Soak
veterán

Mit jelent az, hogy PHP kérés? Esetleg bedobhatnád a kódot.

(#11568) syC válasza Soak (#11567) üzenetére


syC
addikt

HTML oldalakban keresgélek PHPvel, kb 20-30 másodperces a teljes kérés. CSS-el meg JavaScriptel dedobtam a töltési időre egy animációt, és az animáció alá szeretnék kiíratni sztringeket. Úgy gondoltam, hogy a lefutó PHP függvényt megszakítva JS függvénnyel lecserélem az animáció alatti sztringet. Eddig rossz nyomon jártam szerintem mert HTML objektum innerHtml részét módosítottam JS-el, de ez persze fáziskésében jelenítette meg a sztringet. Még agyalok, de minden ötletet örömmel fogadok.

(#11569) fordfairlane válasza Lacces (#11559) üzenetére


fordfairlane
veterán

Az a baj, hogy az $a az egy false... pedig $r-nek van értéke.

$r egy mysql resource, a while pedig addig teker, amíg a fetch false-sal tér vissza. Így tehát normális, hogy $a-ban false van a while ciklus után. Ez valószínűleg egy üres result, a query feltételei nem teljesülnek egy sorra sem.

[ Szerkesztve ]

x gon' give it to ya

(#11570) Peter Kiss válasza syC (#11568) üzenetére


Peter Kiss
senior tag
LOGOUT blog

Használhatsz AJAX-ot erre, először lemarod a HTML-t valamibe, aztán X darab soronként keregélsz benne, ez azt jelenti, hogy összes_sor/X darab AJAX lekérdezésed lesz. Egyébként szerintem keresni kellene valami értelmesebb megoldást, vagy gyorsítani a keresésen.

Tényleg, hogyan keresel?

[ Szerkesztve ]

(#11571) syC válasza Peter Kiss (#11570) üzenetére


syC
addikt

Lennének ötleteim a gyorsításra, de azért lecsuknának. Maradok az ajaxnál, megnézem :). Köszi a tippet.

szerk:

#11572 Sk8erPeter: Sajna nem lehet tudni pontosan, dinamikusan történik az egész.

[ Szerkesztve ]

(#11572) Sk8erPeter válasza syC (#11571) üzenetére


Sk8erPeter
nagyúr

Lehet előre tudni, hány oldalon kell keresgélni? Mert akkor egyszerű lehet a megvalósítása úgy, hogy progress barral jelezd, hol tart épp a dolog.

Sk8erPeter

(#11573) Peter Kiss válasza syC (#11571) üzenetére


Peter Kiss
senior tag
LOGOUT blog

Azért az tényleg fontos lenne, hogy hogyan keres, illetve, mi a cél (elég, ha egy szó megtalálható például, mert akkor nem strstr, hanem strpos-t kell használni, ilyenek).

Egyébként lennék annyira kretén, hogy a HTML-t betolnám egy FULLTEXT indexes adatbázisba, és azzal kerestetném. :D Ha nagy az anyag, akkor szétdarabolom, és akkor máris tud több szálon dolgozni (FULLTEXT helyett jó lehet a LIKE).

(#11574) syC


syC
addikt

html oldalakat keresek html dom parserrel. html-ből domfát építek, aztán keresek valamilyen jelölő vagy attr alapján. Egy html lap átlag 8-10k sor, és általában van 6 db minimum.

(#11575) Peter Kiss válasza syC (#11574) üzenetére


Peter Kiss
senior tag
LOGOUT blog

DOM-parsert kellene kiiktatni trükkös string kezeléssel. (Megkeresni az adott elemet, aztán karakterhelyzet alapján kiszedni azt, ami kell.)

[ Szerkesztve ]

(#11576) syC válasza Peter Kiss (#11575) üzenetére


syC
addikt

Gondolod, hogy a parser ennyire tetü?

(#11577) Peter Kiss válasza syC (#11576) üzenetére


Peter Kiss
senior tag
LOGOUT blog

Ja. Egy próbát mindenképp megér a kihagyása, ha a teszt alatt elsőre nem is 100%-os az eredmény, szerintem sokkal gyorsabb lesz.

(#11578) syC válasza Peter Kiss (#11577) üzenetére


syC
addikt

Ok. Ma csinálok rá egy tesztet. Köszi a tippet :R

(#11579) syC


syC
addikt

5 oldal, összesen ~ 20k sorból 5 keresés:

strstr + strpos: 5.3544 s
dom: 10.2557 s

Hát most meglepődtem.

szerk: mértékegység..

[ Szerkesztve ]

(#11580) Sk8erPeter válasza syC (#11579) üzenetére


Sk8erPeter
nagyúr

Végül is annyira nem meglepő: a DOMDocumenttel (szerk.: vagy más DOM parserrel) való feldolgozás segítségével sokkal komplexebb dolgokat is tudsz művelni a feldolgozott, parse-olt dokumentummal, mint egy sima stringben történő kereséssel. A plusz komplexitás meg időbe kerül.

[ Szerkesztve ]

Sk8erPeter

(#11581) syC válasza Sk8erPeter (#11580) üzenetére


syC
addikt

Jellemző rám, hogy mindig mindent a lehető legbonyolultabban csinálok.. Azt hittem, hogy kb. ugyan olyan gyors lesz a két keresés. Ennek ellenére az eredmény magáért beszél. A parsert kényelemből használtam, de akkor most nekiállok és átírom a dolgokat parsermentesre. Kiváncsi vagyok úgy a végeredményre, hogy összességében mennyit nyertem.

(#11582) Sk8erPeter válasza syC (#11581) üzenetére


Sk8erPeter
nagyúr

Biztos sokat nyersz vele teljesítményben, de ne felejtsd el, hogy ezzel együtt el is veszted a parser által nyert előnyöket, pl. hogy könnyebben fel tudod dolgozni ezeket a dokumentumokat. Céltól függ tehát, hogy érdemes-e lecserélni!

Sk8erPeter

(#11583) Peter Kiss válasza syC (#11579) üzenetére


Peter Kiss
senior tag
LOGOUT blog

És valószínűleg még ezen is lehet húzni majd.

(#11584) pvt.peter


pvt.peter
őstag

Sziasztok!

Ki milyen módszert használ biztonságos adatok leellenőrzéséhez mielőtt beszúrásra kerülnének ezek az adatok adatbázisba?
Illetve ki milyet ajánl?
Én eddig ezzel a fgvnyel próbálkoztam:
function check($value){
if (get_magic_quotes_gpc()){
$value = stripslashes($value);
}
$value = "".mysql_real_escape_string($value)."";
return $value;
}

Ez egy .50-es rombolópuska, elég szép visszarúgással.

(#11585) sztanozs válasza pvt.peter (#11584) üzenetére


sztanozs
veterán

XSS ellen nem vééééd, de ... paraméterezett lekérdezés - és nem kell semmit ellenőrizni, escapelni és trükközni.

[ Szerkesztve ]

JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...

(#11586) pvt.peter válasza sztanozs (#11585) üzenetére


pvt.peter
őstag

rendben, ránézek :)
köszi :)

Ez egy .50-es rombolópuska, elég szép visszarúgással.

(#11587) syC válasza Peter Kiss (#11583) üzenetére


syC
addikt

Hogy lehet a leggyorsabban megoldani az oldal feldolgozást?

Adott egy 300ezer karakteres sztring..

Most úgy keresek , hogy strpos-sal adott szintaktikára keresek, és for ciklussan ezen szintaktikák közötti láncot karakterenként átmásolom egy másik változóba. K. lassú. 30 sec alatt sem végez. :((

(#11588) Peter Kiss válasza syC (#11587) üzenetére


Peter Kiss
senior tag
LOGOUT blog

substr-rel biztosan gyorsabb a másolás, de egyébként arra kellene törekedni, hogy ki lehessen zárni egyes részeket (valahogyan részekre bontani [pl. sorok], és azokban keresni dolgokat előbb, teszem azt, ha nincs benne 'y' betű, akkor nemérdekel többé). Esetleg mixelni az SQL-es megoldással, amit már említettem. Lehetne használni reguláris kifejezéseket is egyes helyeken.

(#11589) syC


syC
addikt

oldal: 299353 karakter t=1.4875s
olvasás t=3.1578 s
olvasás t=2.5427 s
olvasás t=2.0526 s
olvasás t=1.4747 s
olvasás t=1.6876 s
olvasás t=1.1429 s
olvasás t=1.1154 s
olvasás t=1.0605 s
olvasás t=1.0415 s
olvasás t=0.9772 s
olvasás t=0.9598 s
olvasás t=0.9253 s
olvasás t=0.8791 s
olvasás t=0.8455 s
olvasás t=0.8204 s
olvasás t=0.8072 s
olvasás t=0.7699 s
olvasás t=0.8599 s
olvasás t=0.6798 s
olvasás t=0.674 s
olvasás t=0.6491 s
olvasás t=0.6023 s
olvasás t=0.601 s
olvasás t=0.5674 s
olvasás t=0.5536 s
olvasás t=0.5208 s
olvasás t=0.4752 s

Egy olvasás alatt 2 keresés van strpos-al. Az utolsó után elszáll. A bazi nagy sztring lassítja a dolgot. Ahogy csökken a sztring mérete, gyorsul a keresés - ki gondolta volna :) .

(#11590) Sk8erPeter


Sk8erPeter
nagyúr

Azon gondolkoztam, hogy vajon mi indokolja a print_r használatát mondjuk a var_exporttal szemben?
A var_export kimenete egyből felhasználható kódrészletként is, ráadásul jól átlátható kimenetet produkál, míg ugyanez a print_r kimenetére szerintem nem igaz, eleve kevésbé átlátható.
De biztos van valami szempont, ami hirtelen nem jut eszembe.
Még régen mindig a print_r használatát láttam kódokban, így eleinte én is átvettem, de aztán rájöttem, hogy sokkal jobban járok a var_exporttal, ennek a kimenetét az IDE-k is is tudják highlightolni, így könnyebb benne megtalálni, amit keresek.

[ Szerkesztve ]

Sk8erPeter

(#11591) Coyot válasza Sk8erPeter (#11590) üzenetére


Coyot
őstag

print_r úgy működik,mint a var_dump, de tudod visszaadatni vele az értéket( a var_dump azonnal a kimenetre tol mindent).

var_export, meg php-ban felhasználható formában jeleníti meg az értékeket.

nem biztos hogy jól tévedek, de lehet :D

Má' nem

(#11592) Speeedfire válasza Sk8erPeter (#11590) üzenetére


Speeedfire
nagyúr

ennek a kimenetét az IDE-k is is tudják highlightolni
Ezt kifejtenéd?
Én mondjuk a sima var_dump-ot szoktam használni.

Fotóim https://fb.com/toth.szabolcs.art || IG: http://instagram.com/_tothszabolcs_ || Weblapom http://szabolcs-toth.com

(#11593) Sk8erPeter válasza Coyot (#11591) üzenetére


Sk8erPeter
nagyúr

Nem igaz, mert a var_export sem tol mindent egyből a kimenetre, ha TRUE-ra állítod a második paramétert. És én így használom.

(#11592) Speeedfire :
úgy értem, hogy ha egy mondjuk nincs kéznél normális debugger, akkor pl. egy buzinagy tartalmú változó kimenetét becopy-paste-elhetem egy IDE-be, és az highlightolja nekem a kódot.
Ja, és ott a var_dump is, ami szintén nem kódban felhasználható kimenetet ad.

[ Szerkesztve ]

Sk8erPeter

(#11594) Speeedfire válasza Sk8erPeter (#11593) üzenetére


Speeedfire
nagyúr

Ja, hogy ja. :)

Fotóim https://fb.com/toth.szabolcs.art || IG: http://instagram.com/_tothszabolcs_ || Weblapom http://szabolcs-toth.com

(#11595) Peter Kiss válasza Sk8erPeter (#11590) üzenetére


Peter Kiss
senior tag
LOGOUT blog

Resource-öket mindig NULL-ként exportálja, ami által hülyeséget láthat a fejlesztő, miközben hibát keres, a print_r()-rel és a var_dump()-pal nem fordul elő ilyen.

(#11596) Coyot válasza Sk8erPeter (#11593) üzenetére


Coyot
őstag

de a var_export más formában adja vissza a vizsgált változókat mint a másik kettő, tehát alapműködésben teljesen más.

Má' nem

(#11597) Sk8erPeter válasza Peter Kiss (#11595) üzenetére


Sk8erPeter
nagyúr

Na, ez a szempont még nem jutott eszembe. Mondjuk resource-okhoz tartozó változókat nem is túl sokszor debuggolok szerencsére... :)

Rájöttem, hogy még a var_dump() nagy előnye lehet, hogy kiírja a stringek, tömbök, stb. hosszát is, ez legalább informatív. Ezenkívül még egy nagy plusz a var_dump() mellett, hogy az Xdebug defaultból szépíti az ilyen módon kiíratott változókat.
Mondjuk ha valaki szépen akarja látni ezeket a változókat, használjon például Krumo-t: [link].

A print_r() mellett viszont eddig kb. semmi nem szólt. :)

(#11596) Coyot :
"de a var_export más formában adja vissza a vizsgált változókat mint a másik kettő"
És szerinted én korábban miről beszéltem? :D
Pont ezt mondtam, hogy a másik kettő nem használható fel kódrészletként, tehát IDE sem highlightolja, ha bemásolod a kimenetet, viszont a var_exportnak megvan ez az igen nagy előnye. Plusz szemre is könnyebb átlátni szerintem, mint pl. a print_r() kimenetét.

"alapműködésben teljesen más"
A kiíratás módjában vannak különbségek, a cél hasonló.

Vegyünk konkrét példát, kiíratom a $_GET változót, úgy, hogy mondjuk az alábbi címet írom be:

http://test.local/index.php?asd=tenisz%C3%BCt%C5%91&id=123&blabla=qweqwe&foo=bar&data[]=rtetz&data[]=ertwer&data[]=423

print_r() kimenete (előny: számomra ismeretlen):

print_r()

var_dump() kimenete (előny: informatív adatok, pl. tömbök, stringek hossza; valamint a default Xdebug-támogatottság):

var_dump()

var_dump() engedélyezett Xdebuggal:

var_dump() + Xdebug

var_export() kimenete (előny: a kód egyből felhasználható kódként):

var_export()

Sk8erPeter

(#11598) Soak válasza Sk8erPeter (#11597) üzenetére


Soak
veterán

Én mindig a var_dump() és Xdebug kombót használom, mert elég sok és gyorsan értelmezhető infot ad, ha ez nem elég akkor általában más bug van, ha kisebb a projektekt és megoldható, érdemes a netbeans debug sessionnel végiglépkedni a változókon .

(#11599) Speeedfire válasza Soak (#11598) üzenetére


Speeedfire
nagyúr

+1 én is a var_dump() + xdebug-ot használom.

Fotóim https://fb.com/toth.szabolcs.art || IG: http://instagram.com/_tothszabolcs_ || Weblapom http://szabolcs-toth.com

(#11600) Coyot válasza Sk8erPeter (#11597) üzenetére


Coyot
őstag

Meg mertem volna esküdni hogy a var_dump és a print_r uabban a formában adja vissza az adatot, de ha nem, hát nem :D

Má' nem

Útvonal

Fórumok  »  Szoftverfejlesztés  »  PHP programozás (kiemelt téma)
Copyright © 2000-2024 PROHARDVER Informatikai Kft.