лучший способ кодировать путь для использования в качестве html-действительного тега «id» или «name» - PullRequest
1 голос
/ 16 марта 2012

У меня есть редактируемая файловая система, где пользователь может отправлять изменения в форме.

Я хотел бы использовать путь к файлам в качестве тегов NAME или ID.

Поскольку я сомневаюсь, что я первый столкнулся с этим, возможно, есть лучший подход.

Примеры:

path: ../../disney/mouse/mickey.php

Известные ограничения:

Jquery: no periods (.) and colons (:) 
HTML : Only letter, digits,hyphens ("-"), underscores ("_"), colons (":"), and periods (".")
HTML5: All but no spaces ( ) and at least 1 char.

Требуется, чтобы PHP И JAVASCRIPT могли легко кодировать / декодировать строку обоими способами. Я делаю это, заменив "/" & "." с необычными узорами.

Какую кодировку вы советуете, и есть ли что-то, что даже сокращает путь, но остается уникальным ??

С уважением:>

РЕДАКТИРОВАТЬ: пользователи могут изменять и редактировать код из файлов. Почему вы советуете использовать дополнительный ввод для каждого поля, которое связывает путь с контентом? Я не вижу смысла, так как это не проблема, если теги name или id правильно закодированы.

Ответы [ 3 ]

1 голос
/ 16 марта 2012

Вы не должны использовать ваши значения в качестве идентификаторов.Это не очень хорошая практика, и именно поэтому вы сталкиваетесь с этой проблемой.Но если вы все равно хотите это сделать ...

Если вы хотите использовать одну строку для всех языков, вам нужно создать одну строку, исключающую все ограниченные символы, найденные на каждом языке.Если ограниченные символы являются частью пути, становится все труднее сохранить уникальность.Я бы порекомендовал вам взять полный путь, а затем использовать preg_replace (), чтобы изменить все символы, которые не должны быть подчеркнуты.

$old = '../../disney/mouse/mickey.php';
$new = preg_replace('/[^a-z0-9]/i', '_', $old);
echo $new;
//Outputs: "______disney_mouse_mickey_php"

Вы определенно захотите изменить это, чтобы добавить больше разрешенных символов.Чем меньше вы ограничиваете, тем меньше вероятность того, что вы столкнетесь с неуникальными атрибутами id / name.

Если вам нужен метод, который менее подвержен наличию возможного неуникального id / name,затем вы можете обернуть ваш путь в md5 () (PHP), чтобы создать хеш md5.Это менее удобно для чтения, но должно быть достаточно уникальным для большинства некритических целей.

$old = '../../disney/mouse/mickey.php';
$new = md5($old);
echo $new;
//Outputs: "403d07916233847221263553573c5321"

В ответ на ваши комментарии, вот моя последняя попытка.Эта / custom / функция закодирует путь, который является уникальным и читаемым в источнике.Это также позволит вам декодировать в исходную строку пути.Разрешенные символы и escape-символы настраиваются так, что вы можете найти тот, который можно использовать на всех языках, которые вам нужны.

function customPathEncode($old)
{
    $chars_allowed = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $escape_char = '%';
    $new = '';

    $old_length = strlen($old);
    for($i = 0; $i < $old_length; ++$i)
    {
        if(false === strpos($chars_allowed, $old[$i]))
        {
            $new .= $escape_char.bin2hex($old[$i]);
        }
        else
        {
            $new .= $old[$i];
        }
    }

    return $new;
}
echo customPathEncode('../../disney/mouse/mickey.php');
//Output: "%2e%2e%2f%2e%2e%2fdisney%2fmouse%2fmickey%2ephp"
1 голос
/ 16 марта 2012

В этом нет абсолютно никакого смысла.

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

0 голосов
/ 11 марта 2013

Я использую Java , и я решил эту проблему путем кодирования / декодирования путей в / из hex представления пути к файлу .

Я не очень знаком с PHP , но, думаю, вы могли бы использовать bin2hex & hex2bin для этой цели.

Надеюсь, это поможет ...

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