PHP - функция для пропуска strtolower (), если переменная содержит «wikipedia.org» - PullRequest
0 голосов
/ 26 июня 2009

Мой сайт позволяет пользователям вводить URL-адреса в базу данных. Я использую код "$ site = strtolower ($ site);" сделать все эти URL-адреса строчными.

Однако я только что понял, что URL-адреса Википедии чувствительны к регистру, поэтому я хотел бы избежать использования "$ site = strtolower ($ site);" на URL Википедии, каждый из которых содержит «wikipedia.org».

Как написать функцию, которая пропустит шаг "$ site = strtolower ($ site);" если $ site содержит "wikipedia.org"?

Заранее спасибо,

John

Ответы [ 5 ]

9 голосов
/ 26 июня 2009

Все URL на * nix серверах чувствительны к регистру. Некоторые URL-адреса на серверах Windows также чувствительны к регистру.

Редактировать: Доменное имя не чувствительно к регистру (на самом деле, клиент конвертирует его в нижний регистр).

http://user:pass@domain.com/somedir/somefile.ext?someQueryString=someValue#fragment
=======----------==========--------------------------------------------------------

Legend:
    - : Case sensitive
    = : Case insensitive

Примечание: Предполагается, что фрагменты спецификации учитывают регистр, но это не реализовано таким образом на всех клиентах.

Это очень плохая идея делать то, что вы пытаетесь сделать. Лучшим способом было бы просто прописать имя домена в нижнем регистре.

Редактировать 2: Так как вы спросили, вот функция, которая будет правильно прописывать данный URL (только схема и домен):

function urltolower($url) {
    $parts = @parse_url($url);
    if($parts === FALSE) return FALSE;
    $url = '';

    if(!empty($parts['scheme'])) $url .= strtolower($parts['scheme']) . (($parts['scheme'] == 'file') ? ':///' : '://');
    if(!empty($parts['user'])) $url .= $parts['user'] . ((!empty($parts['pass'])) ? ':' . $parts['pass'] : '') . '@';
    if(!empty($parts['host'])) $url .= strtolower($parts['host']);
    if(!empty($parts['port'])) $url .= ':' . $parts['port'];
    if(!empty($parts['path'])) $url .= $parts['path'];
    if(!empty($parts['query'])) $url .= '?' . $parts['query'];
    if(!empty($parts['fragment'])) $url .= '#' . $parts['fragment'];

    return $url;
}

[mixed] urltolower($url)

Нижний регистр URL. Возвращает FALSE при ошибке. В случае успеха возвращает нижний регистр URL.

* 1 028 * Пример:
echo urltolower('HTTP://en.WikiPedia.org/wiki/PHP');
//echo's http://en.wikipedia.org/wiki/PHP
3 голосов
/ 26 июня 2009
if(stristr($site, 'wikipedia.org') === FALSE){
 echo "doesn't contain wikipedia.org";
}else{
 echo "wikipedia.org!";
}

Обновление

Просто краткая заметка о хранении URL в вашей базе данных. Нередко каталог, файл, имя пользователя, пароль или параметр на сервере содержат заглавные буквы. Хотя интерпретация зависит от базовой ОС, веб-сервера и кода, я настоятельно рекомендую не использовать strtolower () ни для чего, кроме, возможно, домена и протокола.

1 голос
/ 26 июня 2009

Это плохая идея. В общем, URL разрешены с учетом регистра, так зачем вам выбрасывать информацию? Если вы сделаете это, вам придется добавить исключение за исключением.

0 голосов
/ 27 июля 2009

Создание простого условия может решить вашу проблему. Установите ваши условия для ваших требований

0 голосов
/ 26 июня 2009

stripos () сообщит вам, существует ли строка в любой точке другой. Проверьте это, и если его там нет, strtolower () будет в безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...