Ejz,
Ik ben al een tijdje opzoek naar een functie waaraan ik 2 URL's kan meegeven en dat die wanneer mogelijk is een relatieve URL terug geeft.
Voorbeeld:
Ik geef onderstaande URL's mee aan de functie.
URL 1: http://gathering.tweakers.net/forum/insert_topic/14
URL 2: http://gathering.tweakers.net/
De functie zou dan ../../ terug moeten geven.
Andersom
URL 1: http://gathering.tweakers.net/
URL 2: http://gathering.tweakers.net/forum/insert_topic/14
De functie zou dan forum/insert_topic/14 terug moeten geven.
Bij 2 totaal verschillende URL's.
URL 1: http://gathering.tweakers.net/
URL 2: http://www.nu.nl/
Zal die gewoon http://www.nu.nl/ terug moeten geven.
Ik heb al op Google en de PHP website gezocht naar een functie die iets vergelijkbaars doet, maar helaas niks gevonden. Het moet ongeveer de omgekeerde zijn van de realpath functie van PHP.
Ik heb ondertussen zelf al wel iets geschreven, maar ik vroeg me af of er niet een ingebakken functie voor zo iets is. De code moet namelijk zo efficiënt / snel / goed mogelijk zijn, ik heb de twijfels over mijn eigen code.
Bovenstaande zal forum/insert_topic/14 weergeven in de browser, wat voor zover ik weet juist is. Ik heb de functie nog niet uitgebreid getest, maar hij doet tot nu wel wat ik wil. Toch maak ik het liefst gebruik van standaard functies...
Ik ben al een tijdje opzoek naar een functie waaraan ik 2 URL's kan meegeven en dat die wanneer mogelijk is een relatieve URL terug geeft.
Voorbeeld:
Ik geef onderstaande URL's mee aan de functie.
URL 1: http://gathering.tweakers.net/forum/insert_topic/14
URL 2: http://gathering.tweakers.net/
De functie zou dan ../../ terug moeten geven.
Andersom
URL 1: http://gathering.tweakers.net/
URL 2: http://gathering.tweakers.net/forum/insert_topic/14
De functie zou dan forum/insert_topic/14 terug moeten geven.
Bij 2 totaal verschillende URL's.
URL 1: http://gathering.tweakers.net/
URL 2: http://www.nu.nl/
Zal die gewoon http://www.nu.nl/ terug moeten geven.
Ik heb al op Google en de PHP website gezocht naar een functie die iets vergelijkbaars doet, maar helaas niks gevonden. Het moet ongeveer de omgekeerde zijn van de realpath functie van PHP.
Ik heb ondertussen zelf al wel iets geschreven, maar ik vroeg me af of er niet een ingebakken functie voor zo iets is. De code moet namelijk zo efficiënt / snel / goed mogelijk zijn, ik heb de twijfels over mijn eigen code.
PHP:
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
| function determineRelativeURL($url = NULL, $relativeUrl = NULL) { if(!isset($url) || !isset($relativeUrl)) return ''; $urlData = parse_url($url); $relativeUrlData = parse_url($relativeUrl); if($urlData['scheme'] != $relativeUrlData['scheme']) return $relativeUrl; else if($urlData['port'] != $relativeUrlData['port']) return $relativeUrl; $urlPath = $urlData['path']; $relativeUrlPath = $relativeUrlData['path']; $urlPath = substr($urlPath, 0, strrpos($urlPath, '/')); $relativeUrlFile = substr($relativeUrlPath, strrpos($relativeUrlPath, '/') + 1); $relativeUrlPath = substr($relativeUrlPath, 0, strrpos($relativeUrlPath, '/')); $urlPath = preg_split('/[\/]+/', $urlPath, -1, PREG_SPLIT_NO_EMPTY); $relativeUrlPath = preg_split('/[\/]+/', $relativeUrlPath, -1, PREG_SPLIT_NO_EMPTY); $numberItems = max(count($urlPath), count($relativeUrlPath)); for($i = 0; $i < $numberItems; $i++) { if(!array_key_exists($i, $relativeUrlPath)) $relativePath .= '../'; else if(!array_key_exists($i, $urlPath)) $relativePath .= $relativeUrlPath[$i].'/'; } return $relativePath.$relativeUrlFile; } $url = 'http://gathering.tweakers.net/'; $relativeUrl = 'http://gathering.tweakers.net/forum/insert_topic/14'; echo determineRelativeURL($url, $relativeUrl); |
Bovenstaande zal forum/insert_topic/14 weergeven in de browser, wat voor zover ik weet juist is. Ik heb de functie nog niet uitgebreid getest, maar hij doet tot nu wel wat ik wil. Toch maak ik het liefst gebruik van standaard functies...
- Is er een standaard functies bekend binnen PHP die iets vergelijkbaars doet?
- Zijn er PHP extensies / pakketten (ZEND, PEAR, etc.) die hier functies voor hebben?
- Wat kan er eventueel beter aan mij functie?
[ Voor 5% gewijzigd door remcotolsma op 25-04-2006 16:00 ]