Как мне вызвать в PHP, чтобы проверить, соответствует ли строка шаблону? - PullRequest
0 голосов
/ 03 августа 2009

Я нашел [этот код сокращения URL] [1] в Интернете.

Теперь я хочу кое-что добавить. Я хочу выдать ошибку пользователю, если он введет ссылку с bit.ly, TinyURL.com или tr.im. Я хочу сказать: «Извините, мы не сокращаем короткие URL-адреса». Я знаю, что мне нужно создать операторы if и else, но я не знаю, что мне нужно называть.

Edit:

Большое спасибо за вклад! К сожалению, я полностью сбит с толку. Где я могу разместить эти предложения кода? В верхней части index.php. Прямо сейчас у меня есть следующий PHP-код ..

<?php
require_once('config.php');
require_once('functions.php');

if ($url = get_url())
{
    $conn = open_connection();
    $res = mysql_query("SELECT `id` FROM `urls` WHERE `url`='$url' LIMIT 1", $conn);
    if (mysql_num_rows($res))
    {
        // this URL entry already exists in the database
        // get its ID instead
        $row = mysql_fetch_object($res);
        $id = $row->id;
    }
    else
    {
        // a new guy, insert it now and get its ID
        mysql_query("INSERT INTO `urls`(`url`) VALUES('$url')", $conn);
        $id = mysql_insert_id($conn);
    }

    // now convert the ID into its base36 instance
    $code = base_convert($id, 10, 36);
    $shorten_url = "{$config['host']}/$code";

    // and beautifully display the shortened URL
    $info = sprintf('
<span class="long-url" style="visibility: hidden;">%s</span>
<span style="visibility: hidden">%d</span> <br>
    Link to drop:
    <a class="shorteen-url" href="%s">%s</a>
    <span style="visibility: hidden">%d</span>',
        $_GET['url'], strlen($_GET['url']),
        $shorten_url, $shorten_url,
        strlen($shorten_url));
}

?>

Я не использую $info = sprintf ... может быть, мне следует заменить $info = sprintf на одно из предложений ниже?

Ответы [ 3 ]

3 голосов
/ 03 августа 2009
if(preg_match('!^(?:http://)?(?:www\.)?(?:bit\.ly|tinyurl\.com|tr\.im)/!i', $url))
    die("Sorry, we do not shorten short URLs.");
2 голосов
/ 03 августа 2009

Вы можете использовать следующее, чтобы проверить, был ли сокращен URL-адрес:

if(preg_match('#^https?://[^/]*?(tinyurl\.com|tr\.im|bit\.ly)#i', $myUrl) {
    echo "Sorry, we do not shorten short URLs.";
} else {
    echo "We can shorten that!";
}
1 голос
/ 03 августа 2009

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

strpos принимает строку для проверки, совпадение, необязательное смещение и возвращает FALSE, если совпадения не было в строке.

$url_chk = strtolower($original_url);
if (strpos($url_chk, 'bit.ly') === FALSE
 || strpos($url_chk, 'tinyurl.com')  === FALSE
 || strpos($url_chk, 'tr.im') === FALSE) {
    echo "Sorry, we do not shorten short URLs.";
} else {
    echo "We can shorten that!";
}

РЕДАКТИРОВАТЬ : я изменяю исходный URL-адрес на нижний регистр, чтобы упростить сопоставление, поскольку, например, пользователь мог отправить URL-адрес как tinyURL.com.

ВТОРОЕ РЕДАКТИРОВАНИЕ Чтобы ответить на ваше замечание: кажется, что строка с сокращенным URL создана в строке

$shorten_url = "{$config['host']}/$code";

, что означает, что $config['host'] должен содержать соответствующую часть URL. Но не ясно, откуда это взялось. По-видимому, он создан в config.php.

Наши предложения, использующие die() или echo(), являются просто предложениями, не встраивайте это непосредственно в ваш sprintf или код без фактической их адаптации.

...