Ik ben bezig met een functie die in een string alle URLs opzoekt, kijkt of die URLs "shortened" zijn (bv. http://bit.ly/fd4GDs) of "gewoon" (http://tweakers.net), en de shortened URLs vervangt door de resolved URL. Ik ben hierin redelijk geslaagd, behalve voor het laatste deel:
De bedoeling is dus dat reverse_urls() als output geeft:
Dat laatste stuk, het vervangen van "shortened" door "resolved" URLs, lukt nog niet. Dit zou kunnen met preg_replace of preg_replace_callback (ipv eerst matchen met preg_match_all), maar preg_replace en preg_replace_callback stoppen met werken nadat ze de eerste URL gematched hebben, en ik zie even niet hoe ik hier omheen kan werken. Aan de andere kant loop ik nu ook vast; dat ik de "resolved" URLs in een array heb ik leuk, maar hoe vervang ik nu de URLs in de tekst?
P.S. Ik weet dat de regexp die ik gebruik slechts heel rudimentair is, maar dat is een zorg voor later
(ik ben nu eenmaal niet zo'n regexp held).
P.P.S. In plaats van de headers aan te vragen van elke URL, zou ik ook van tevoren kunnen bepalen of een URL van een shortening service is, maar het is haast onmogelijk om daar een uitputtende array van te geven waartegen je kunt matchen...
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| function reverse_urls($text) { preg_match_all('!http://[\S]+!', $text, $matches); foreach ($matches[0] as $url) { $headers = get_headers($url, 1); if (!empty($headers['Location'])) { // Probably shortened URL $headers['Location'] = (array) $headers['Location']; $return[] = array_pop($headers['Location']); // Handle multiple redirects } else { // Regular URL $return[] = $url; } } print_r($return); } $string = "Text met shortened http://read.bi/fRO2yK en normale http://www.nu.nl urls"; // http://read.bi/fRO2yK leidt naar http://www.businessinsider.com/huffington-post-investors-2011-2 reverse_urls($text); |
De bedoeling is dus dat reverse_urls() als output geeft:
code:
1
2
| Text met shortened http://www.businessinsider.com/huffington-post-investors-2011-2 en normale http://www.nu.nl urls |
Dat laatste stuk, het vervangen van "shortened" door "resolved" URLs, lukt nog niet. Dit zou kunnen met preg_replace of preg_replace_callback (ipv eerst matchen met preg_match_all), maar preg_replace en preg_replace_callback stoppen met werken nadat ze de eerste URL gematched hebben, en ik zie even niet hoe ik hier omheen kan werken. Aan de andere kant loop ik nu ook vast; dat ik de "resolved" URLs in een array heb ik leuk, maar hoe vervang ik nu de URLs in de tekst?
P.S. Ik weet dat de regexp die ik gebruik slechts heel rudimentair is, maar dat is een zorg voor later
P.P.S. In plaats van de headers aan te vragen van elke URL, zou ik ook van tevoren kunnen bepalen of een URL van een shortening service is, maar het is haast onmogelijk om daar een uitputtende array van te geven waartegen je kunt matchen...
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."