Понимание parse_str в php - PullRequest
       29

Понимание parse_str в php

0 голосов
/ 30 сентября 2011

Я новичок в php, пытающийся найти способ использовать parse_str для анализа нескольких URL-адресов из базы данных (примечание: не из запроса, они уже хранятся в базе данных, не спрашивайте ... так_GET не будет работать)

Итак, я пытаюсь это сделать:

    $parts = parse_url('http://www.jobrapido.se/?w=teknikinformat%C3%B6r&l=malm%C3%B6&r=auto');
    parse_str($parts['query'], $query);
    return $query['w'];

Обратите внимание, что здесь я просто предоставляю пример URL-адреса, в реальном приложении URL-адрес будет передан вв качестве параметра из базы данных.И если я делаю это, он работает нормально.Однако я не понимаю, как правильно использовать эту функцию и как избежать ошибок.Прежде всего, здесь я использовал «w» в качестве индекса для возврата, потому что я ясно видел, что это было в запросе.Но как эти вещи работают?Есть ли набор конкретных значений, которые я могу использовать, чтобы получить всю строку запроса?Я имею в виду, что если я посмотрю дальше, я также смогу увидеть здесь «l» и «r» ... Конечно, я мог бы также извлечь их и объединить результат, но будут ли эти имена значений произвольными или есть способ узнатькакие именно извлечь?Конечно, есть значение «q», которое я изначально думал, что будет единственным, которое мне понадобится, но, видимо, нет.Это даже не в URL-адресе примера, хотя я знаю, что во многих других.

Так как мне это сделать.Вот что я хочу:

  1. Извлечь все части строки запроса, которые дают мне читаемый вывод строки поиска URL-адреса строки (поэтому в приведенном выше тексте это будет "teknikinformatör Malmö auto". Примечание.что мне нужно было бы перевести кодировку url на шведские символы, любой простой способ сделать это в php?)
  2. Обрабатывать ошибки, чтобы, если по какой-то причине вышеприведенное не сработало, метод должен возвращать толькопустая строка, таким образом, не нарушая код.Потому что в этот момент, если бы я использовал вышеупомянутое с фактическим параметром, переданным $ url вместо примера url, я бы получил ошибки, потому что многие из URL не имеют параметра "w", некоторые могут быть пустыми полями вбаза данных, некоторые могут быть искажены и т. д. Так как я могу стабильно обрабатывать такие ошибки и просто возвращать значение, если синтаксический анализ работает, и возвращать пустую строку в противном случае?

РЕДАКТИРОВАТЬ:

Кажется, возникает очень странная проблема, которую я не вижу во время отладки.Я поместил этот тестовый код просто для того, чтобы посмотреть, что происходит:

function getQuery($url)
{
    try
    {
        $parts = parse_url($url);
        parse_str($parts['query'], $query);
        if (isset($query['q'])) {
            /*return $query['q'];*/
            return '';
        }
    } catch (Exception $e) {
        return '';
    }
}

Теперь, очевидно, в реальном коде я бы хотел, чтобы было возвращено что-то вроде закомментированной части.Однако, загадочная вещь такова:

С этим кодом, насколько я вижу, каждый путь должен приводить к возвращению пустой строки.Но это не работает - это дает мне полностью пустую сетку на странице результатов.Никаких ошибок или чего-либо еще во время отладки, и объекты выглядят хорошо, когда я перебираю их во время отладки.

Однако, если я удаляю все из этого метода, кроме return '';тогда он работает нормально - конечно, поле в сетке, где должен находиться запрос, пусто, но все остальные поля имеют всю информацию, как и должны.Так что это был просто тест.Но как это возможно, что код, который должен иметь возможность возвращать только пустую строку, не работает, в то время как тот, который возвращает только пустую строку и больше ничего не работает?Я полностью сбит с толку ...

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

Значение параметров запроса полностью зависит от приложения, которое обрабатывает URL, поэтому нет «правильного» параметра - это может быть w, q или searchquery. Что вы можете сделать, так это эвристически найти наиболее распространенные переменные (= догадка) или вернуть массив всех аргументов. Это зависит от того, чего вы пытаетесь достичь.

parse_str уже декодирует urlencoding. Обратите внимание, что urlencoding - это способ кодирования байтов , а не символов. Это зависит от того, какую кодировку ожидает приложение. Обычно (и в этом примере запроса) это должно быть везде UTF-8, так что вы должны быть покрыты 1.

Проверьте, существует ли значение, и, если нет, верните пустую строку, например:

$heuristicFields = array('q', 'w', 'searchquery');
foreach ($heuristicFields as $hf) {
  if (isset($query[$hf])) return $query[$hf];
}
return '';

РЕДАКТИРОВАТЬ: функция возвращает null, если ввод действителен, и сталкивается с ошибками (то есть отображает предупреждающие сообщения), когда URL явно недействителен. Блок try..catch не имеет никакого эффекта.

0 голосов
/ 03 октября 2011

Оказалось, что проблема была со шведскими символами - если я использовал utf8_encode () для значения до его возвращения, оно работало нормально.Если кто-нибудь знает лучший способ сделать это, я был бы рад услышать это, иначе это будет работать для меня по крайней мере.

...