Maar dan mag het toch niet allebei? Het ene of het anderequote:
Dat is XOR.quote:Op maandag 13 mei 2013 15:37 schreef wobbel het volgende:
[..]
Maar dan mag het toch niet allebei? Het ene of het andere
select * from users where ID = 5 or naam = "henk".quote:Op maandag 13 mei 2013 15:32 schreef wobbel het volgende:
Ik klop al veel te lang geen code meer, hoe selecteer ik het volgende:
tabel 'users'
ID
Naam
SELECT * FROM users WAARVAN ID = 5 EN/OF (dus mag ook allebei) Naam = henk
Kun je beargumenteren waarom het sneller zou moeten zijn?quote:Op maandag 13 mei 2013 15:02 schreef wipes66 het volgende:
[ code verwijderd ]
zo moet hij nog sneller zijn als het goed is, maar misschien iets minder goed leesbaar/duidelijk dan #2
En ook alles dat geen vijf is, maar wel henk.quote:Op maandag 13 mei 2013 15:37 schreef GI het volgende:
[..]
select * from users where ID = 5 or naam = "henk".
Dan krijg je alles met vijf, ook als het henk is
geen if statement in de loopquote:Op maandag 13 mei 2013 15:45 schreef papernote het volgende:
[..]
Kun je beargumenteren waarom het sneller zou moeten zijn?
Dat wil hij toch ook ?quote:Op maandag 13 mei 2013 15:46 schreef papernote het volgende:
[..]
En ook alles dat geen vijf is, maar wel henk.
Ja dus? Branch prediction met een constante boolean, daar ga je niets van merken in de looptijd.quote:
Die tweede foreach kun je trouwens vervangen door een array_flip().quote:Op maandag 13 mei 2013 15:02 schreef wipes66 het volgende:
[ code verwijderd ]
zo moet hij nog sneller zijn als het goed is, maar misschien iets minder goed leesbaar/duidelijk dan #2
je hebt helemaal gelijk ik heb het voor de grap eens getest en het is zelf iets langzamerquote:Op maandag 13 mei 2013 15:48 schreef papernote het volgende:
[..]
Ja dus? Branch prediction met een constante boolean, daar ga je niets van merken in de looptijd.
Het feit dat je nu tweemaal een identieke foreach hebt vind ik nadeliger qua onderhoud van je code.
Wow, nice .quote:Op maandag 13 mei 2013 15:51 schreef papernote het volgende:
[..]
Die tweede foreach kun je trouwens vervangen door een array_flip().
Iets waar gewoon een lijstje uitkomt ipv een gare array die ik nog moet parsen zou leuk zijn. Maar het is er niet he?quote:
Een oplossing die ik wel eens gezien heb is het resultaat uit information_schema.columns te halen. Dat levert iets als enum('foo','bar','baz'). Dan in php enum vervangen door array en het geheel eval()-en. Een andere mogelijkheid zou ik zo niet weten.quote:Op woensdag 15 mei 2013 19:51 schreef Tijn het volgende:
[..]
Iets waar gewoon een lijstje uitkomt ipv een gare array die ik nog moet parsen zou leuk zijn. Maar het is er niet he?
1 2 3 4 5 | <a href="../niets.html">pagina ondieper</a> <a href="./">zelfde diepte</a> <a href="/">Root pagina</a> <a href="../../../niets.html">Veel ondieper</a> <a href="/nieuws/werkend/pagina.html">Veel diepere pagina vanaf root</a> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | <?php error_reporting(E_ALL); function checkUrl($baseUrl, $currentUrl, $foundUrl) { echo 'Original foundUrl: ' . $foundUrl . '<br />'; if (strtolower(substr($foundUrl, 0, 7)) != "http://") { $p = parse_url($foundUrl); if (!isset($p['host'])) { $path = ''; if (strpos($foundUrl, "../") > -1) { $dotsCount = 0; while (strpos($foundUrl, "../") > -1) { $foundUrl = substr($foundUrl, 3); $dotsCount++; } $p = parse_url($currentUrl); $dirs = explode("/", $p['path']); if (count($dirs) > 1) { foreach ($dirs AS $k=>$v) { if (strlen($v) == 0) { unset($dirs[$k]); } } unset($dirs[count($dirs)]); reset($dirs); } if (count($dirs) > $dotsCount) { for ($x = 0; $x < $dotsCount; $x++) { unset($dirs[count($dirs) - $x]); } $path = implode("/", $dirs) . "/"; // die("meer"); } } elseif (strpos($foundUrl, "./") > -1) { $foundUrl = substr($foundUrl, 2); } elseif (substr($foundUrl, 0, 1) == "/") { $foundUrl = substr($foundUrl, 1); } $foundUrl = $baseUrl . $path . $foundUrl; } } echo 'BaseUrl: ' . $baseUrl . '<br />'; echo 'CurrentUrl: ' . $currentUrl . '<br />'; echo 'FoundUrl: ' . $foundUrl . '<br />'; } $baseUrl = 'http://www.yourwebsite.com/'; $currentUrl = 'http://www.yourwebsite.com/blogs/archive/all.html'; checkUrl($baseUrl, $currentUrl, '../../../niets/test/adem.html'); echo '<hr>'; checkUrl($baseUrl, $currentUrl, '../../../../../niets.html'); echo '<hr>'; checkUrl($baseUrl, $currentUrl, '/niets.html'); echo '<hr>'; checkUrl($baseUrl, $currentUrl, './niets.html'); echo '<hr>'; checkUrl($baseUrl, $currentUrl, '../niets.html'); echo '<hr>'; checkUrl($baseUrl, $currentUrl, 'niets.html'); echo '<hr>'; ?> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | Original foundUrl: ../../../niets/test/adem.html BaseUrl: http://www.yourwebsite.com/ CurrentUrl: http://www.yourwebsite.com/blogs/archive/all.html FoundUrl: http://www.yourwebsite.com/niets/test/adem.html ---- Original foundUrl: ../../../../../niets.html BaseUrl: http://www.yourwebsite.com/ CurrentUrl: http://www.yourwebsite.com/blogs/archive/all.html FoundUrl: http://www.yourwebsite.com/niets.html ---- Original foundUrl: /niets.html BaseUrl: http://www.yourwebsite.com/ CurrentUrl: http://www.yourwebsite.com/blogs/archive/all.html FoundUrl: http://www.yourwebsite.com/niets.html ---- Original foundUrl: ./niets.html BaseUrl: http://www.yourwebsite.com/ CurrentUrl: http://www.yourwebsite.com/blogs/archive/all.html FoundUrl: http://www.yourwebsite.com/niets.html ---- Original foundUrl: ../niets.html BaseUrl: http://www.yourwebsite.com/ CurrentUrl: http://www.yourwebsite.com/blogs/archive/all.html FoundUrl: http://www.yourwebsite.com/blogs/niets.html ---- Original foundUrl: niets.html BaseUrl: http://www.yourwebsite.com/ CurrentUrl: http://www.yourwebsite.com/blogs/archive/all.html FoundUrl: http://www.yourwebsite.com/niets.html |
Heb je iets van basename, dirname functies in php, dat gebruiken, scheelt je een hoop gezeik volgens mij. Je hebt ook een realpath functie. Ik zou die eens gebruiken.quote:Op woensdag 15 mei 2013 23:30 schreef Chandler het volgende:
Hey allemaal,
Ben sinds een paar dagen met een crawler aan het spelen en heb nu een functie gemaakt die kijkt of links een volledige of juist onvolledige link heeft, indien er geen http:// in voorkomt wil ik het aanpassen, dat heb ik nu met de volgende functie gedaan, maar nu de vraag aan jullie. Wat zouden jullie anders doen?
Voorbeeld links
[ code verwijderd ]
[ code verwijderd ]
uitkomst
[ code verwijderd ]
Ik hoor graag wat jullie er van vinden...
Volgens mij klopt die niet.quote:Op woensdag 15 mei 2013 23:30 schreef Chandler het volgende:
----
Original foundUrl: ./niets.html
BaseUrl: http://www.yourwebsite.com/
CurrentUrl: http://www.yourwebsite.com/blogs/archive/all.html
FoundUrl: http://www.yourwebsite.com/niets.html
----
Het gaat om parsen van links in een documentquote:Op donderdag 16 mei 2013 09:31 schreef slacker_nl het volgende:
Heb je iets van basename, dirname functies in php, dat gebruiken, scheelt je een hoop gezeik volgens mij. Je hebt ook een realpath functie. Ik zou die eens gebruiken.
Je hebt gelijk gisteren echt overheen gekeken, gelijk even proberen te fixen, maar verder nog tips? of is deze dirty manier goed genoeg?quote:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | <?php error_reporting(E_ALL); function checkUrl($baseUrl, $currentUrl, $foundUrl) { echo 'Original foundUrl: ' . $foundUrl . '<br />'; // geen HTTP gevonden? if (strtolower(substr($foundUrl, 0, 7)) != "http://") { // parse $foundURL $p = parse_url($foundUrl); // geen hostname gevonden? if (!isset($p['host'])) { $path = ''; // parse current url $p = parse_url($currentUrl); // explode directories $dirs = explode("/", $p['path']); // kijken of er subdirectories gevonden zijn?! if (count($dirs) > 1) { // verwijder lege directories (eg ///) foreach ($dirs AS $k=>$v) { if (strlen($v) == 0) { unset($dirs[$k]); } } // unset laatste directorie aangezien dat geen directory maar het aangeroepen bestand is unset($dirs[count($dirs)]); // reset array index reset($dirs); } // ../ gevonden in $foundURL? if (strpos($foundUrl, "../") > -1) { $dotsCount = 0; // verwijder alle ../ en update counter while (strpos($foundUrl, "../") > -1) { $foundUrl = substr($foundUrl, 3); $dotsCount++; } // is aantal dirs groter dan $dotsCount? if (count($dirs) > $dotsCount) { // verwijder te veel directories... for ($x = 0; $x < $dotsCount; $x++) { unset($dirs[count($dirs) - $x]); } // genereer nieuwe path; $path = implode("/", $dirs) . "/"; } } // ./ gevonden? elseif (strpos($foundUrl, "./") > -1) { // gebruik volledig path $path = implode("/", $dirs) . "/"; $foundUrl = substr($foundUrl, 2); } // / is verwijzing voor root van domein. elseif (substr($foundUrl, 0, 1) == "/") { // verwijder eerste / $foundUrl = substr($foundUrl, 1); } // combineer nieuwe $foundUrl $foundUrl = $baseUrl . $path . $foundUrl; } } // test case echo 'BaseUrl: ' . $baseUrl . '<br />'; echo 'CurrentUrl: ' . $currentUrl . '<br />'; echo 'FoundUrl: ' . $foundUrl . '<br />'; } $baseUrl = 'http://www.yourwebsite.com/'; $currentUrl = 'http://www.yourwebsite.com/blogs/archive/all.html'; checkUrl($baseUrl, $currentUrl, '../../../niets/test/adem.html'); echo '<hr>'; checkUrl($baseUrl, $currentUrl, '../../../../../niets.html'); echo '<hr>'; checkUrl($baseUrl, $currentUrl, '/niets.html'); echo '<hr>'; checkUrl($baseUrl, $currentUrl, './niets.html'); echo '<hr>'; checkUrl($baseUrl, $currentUrl, '../niets.html'); echo '<hr>'; checkUrl($baseUrl, $currentUrl, 'niets.html'); echo '<hr>'; ?> |
1 2 3 4 | Original foundUrl: ./niets.html BaseUrl: http://www.yourwebsite.com/ CurrentUrl: http://www.yourwebsite.com/blogs/archive/all.html FoundUrl: http://www.yourwebsite.com/blogs/archive/niets.html |
Dus? Ahh, kutzooit, readlink -m is niet geimplementeerd in php. Dus..quote:Op donderdag 16 mei 2013 09:57 schreef Chandler het volgende:
Het gaat om parsen van links in een document
Nee maar is wel gemakkelijk om het zo in een test case te verwerken zodat ik deze gemakkelijk kan aanpassenquote:Op donderdag 16 mei 2013 11:02 schreef Tijn het volgende:
Wil je $baseUrl echt elke keer meegeven aan de functie? Dat is (binnen de applicatie) toch altijd dezelfde waarde? Ik zou er een constante van maken die je ergens in je config-file definieert.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | <?php error_reporting(E_ALL); function checkUrl($currentUrl, $foundUrl) { if (!$foundUrl) { return $currentUrl; } if (preg_match('/^[a-z]+?:\/\//', $foundUrl)) { return $foundUrl; } $matches; preg_match('/^([a-z]+?:\/\/)(.+)?/', $currentUrl, $matches); $iets=$matches[1]; $baseurl= $matches[2]; if(preg_match('/^\//', $foundUrl)) { $baseurl = preg_replace('/\/.+/', '', $baseurl); return "$iets$baseurl$foundUrl"; } elseif (preg_match('/^\.\//', $foundUrl)) { $baseurl = preg_replace('/\/$/', '', $baseurl); $foundUrl = substr_replace($foundUrl, "" ,0, 2); return checkUrl("$iets$baseurl", $foundUrl); } elseif (preg_match('/^\.\.\//', $foundUrl)) { $baseurl = preg_replace('/\/\w+\/?$/', '', $baseurl); $foundUrl = substr_replace($foundUrl, "" , 0, 3); return checkUrl("$iets$baseurl", $foundUrl); } $currentUrl = preg_replace('/\/?$/', '', $currentUrl); return "$currentUrl/$foundUrl"; } function is($found, $want, $desc) { if ($want == $found) { print "OK: $desc\n"; } else { print "KO $desc: Wanted $want, got $found\n"; } } is(checkUrl("http://x.nl/deep/shizzle/cabizzle", '/x.php'), 'http://x.nl/x.php', 'absolute path with dir ending with /'); is(checkUrl("", "http://x.nl"), 'http://x.nl', "no current url"); is(checkUrl("http://x.nl", ""), 'http://x.nl', "no href found"); is(checkUrl("http://x.nl", '/x.php'), 'http://x.nl/x.php', "absolute path"); is(checkUrl("http://x.nl/deep", '/x.php'), 'http://x.nl/x.php', 'absolute path with dir'); is(checkUrl("http://x.nl/deep/", '/x.php'), 'http://x.nl/x.php', 'absolute path with dir ending with /'); is(checkUrl("http://x.nl/deep/", './x.php'), 'http://x.nl/deep/x.php', 'relative path, same dir'); is(checkUrl("http://x.nl/deep/", '../x.php'), 'http://x.nl/x.php', 'relative path, in higher/lower dir'); is(checkUrl("http://x.nl/deep/shizzle", '../../x.php'), 'http://x.nl/x.php', 'relative path, in higher/lower dir, but deeper'); is(checkUrl("http://x.nl/deep/shizzle", './../x.php'), 'http://x.nl/deep/x.php', 'relative path, another option'); |
SPOILER: nog kekkerOm spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.In theory there is no difference between theory and practice. In practice there is.
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |