PHP - Взрыв на символ (ы), которые никогда не могут быть определены пользователем ... Как? - PullRequest
0 голосов
/ 12 декабря 2011

Хорошо, я пытаюсь найти символ или группу символов, или что-то, что можно использовать, из которого я могу взорваться, так как текст определяется пользователем, мне нужно иметь возможность взорваться из значения, которое у меня есть, чтоникогда не может быть внутри текста.

Как я могу это сделать?

Пример того, что я пытаюсь сделать ...

$value = 'text|0||#fd9||right';

Хорошо,

текст - это то, что здесь никогда не изменится.0, опять не изменяемый #fd9 - это определяемая пользователем строка, которая может быть любой, которую пользователь вводит ... и вправо устанавливает ориентацию (влево или вправо).

Итак, проблема в том, что ясталкивается с этим: Как explode("||", $value), чтобы, если есть ||внутри пользовательской части ... Пример:

$value = 'text|0||Just some || text in here||right';

Итак, если пользователь помещает ||в определенной пользователем части строки, чем это портит это.Как это сделать независимо от того, что пользователь вводит в строку?Так что он должен возвращать следующий массив:

array('text|0', 'Just some || text in here', 'right');

Должен ли я использовать разные символы для взрыва?Если да, что я могу использовать, чтобы пользователь не смог ввести в строку, или как я могу проверить это и исправить это?Я, вероятно, не должен использовать ||в этом случае, но что я могу использовать, чтобы исправить это?

Кроме того, значение будет сначала поступать из строки, а затем из базы данных (после сохранения).

ЛюбойИдеи?

Ответы [ 3 ]

5 голосов
/ 12 декабря 2011

Проблема представления произвольных типов данных в виде строк всегда сталкивается именно с проблемой, которую вы описываете, и она уже была решена многими способами. Этот процесс называется сериализация , и существует множество форматов сериализации, начиная с нативного PHP serialize до JSON и заканчивая XML. Все эти форматы определяют, как представлять сложные структуры данных в виде строк, включая экранирующие правила для использования символов, имеющих особое значение в формате сериализации, в самих сериализованных значениях.


Из комментариев:

Хорошо, ну, в общем, все просто. Я уже обрисовал в общих чертах 13 других параметров и как они работают в Dream Portal, расположенном здесь: http://dream -portal.net / topic_122.0.html так что вы можете увидеть, как они вписываются. работая над параметром fieldset, который в основном использует все эти параметры, а затем некоторые из них, чтобы включить несколько параметров в 1. В любом случае, надеюсь, что ссылка поможет вам понять, как выглядит XML-файл для модуля: http://dream -portal.net/topic_98.0.html посмотрите раздел info.xml, обратите внимание на тег <param>, внизу, 2 из них.

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

<param name="test_param" type="select">0:opt1;opt2;opt3</param>

было бы гораздо больше смысла записать как

<select name="test_param">
    <option default>opt1</option>
    <option>opt2</option>
    <option>opt3</option>
</select>

Каждый уникальный параметр конфигурации может иметь свое собственное уникальное пространство имен элементов с настраиваемыми подэлементами в зависимости от типа параметра, который вы хотите представить. Тогда нет необходимости придумывать собственный мини-формат для каждого возможного параметра. Он также позволяет вам создавать формальную XML-схему (будет ли это полезно для вас или нет - это отдельная тема, но, по крайней мере, вы используете XML так, как предполагалось).

0 голосов
/ 12 декабря 2011

Вы можете закодировать любой пользовательский ввод в base64, а затем использовать его с разнесением или любым другим способом.

print base64_encode("abcdefghijklmnopqrstuvwxyz1234567890`~!@#$%^&*()_+-=[];,./?>:}{<");

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

взгляните на руководство по PHP, как его использовать:

0 голосов
/ 12 декабря 2011

РЕДАКТИРОВАТЬ: новое решение

Является ли гарантией, что text не содержит ||? Если это не так, вы можете использовать substr() в сочетании с strpos() и strrpos() вместо взрыва


Вот что я обычно делаю, чтобы обойти эту проблему.

1) захватить текст пользователя и сохранить его в переменную $user_text;

2) запустите str_replace() на $user_text, чтобы заменить символы, которые вы хотите разделить на:

//replace with some random string the user would hopefully never enter 
$modified = str_replace('||','{%^#',$user_text);

3) теперь вы можете безопасно explode ваш текст, используя ||

4) теперь запускайте str_replace на каждой части разнесения, чтобы вернуть исходный введенный пользователем текст

foreach($parts as &$part) {
    $part = str_replace('{%^#','||',$part);
}
...