Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> рызрыв строки на слова, разделители пробелы, + принимает за пробел 
V
    Опции темы
g27
Дата 14.11.2009, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 29.9.2007
Где: Vilnius

Репутация: нет
Всего: нет



Здравствуйте. Делаю так.
Код

 $search_array=split(" ",$VARS['search_string']);

но за разделители принимаются и плюсы, тоесть +. Почему так? Как сделать что бы только по пробелам? Спасибо.
PM MAIL Skype   Вверх
Pitlord
Дата 15.11.2009, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 31.10.2009

Репутация: нет
Всего: 7



g27, split() является устаревшей функцией, используй preg_split():
Код

<?php
$search_array = preg_split('/\\s+/', 'The quick brown fox jumped over the lazy dog');
?>

Можно даже explode(), но тогда будут пустые элементы при нескольких пробелах подряд.

P.S. POSIX-функции, включая split(), не использовал ни разу, поэтому ответить на сам вопрос затрудняюсь.
PM MAIL   Вверх
bars80080
Дата 15.11.2009, 00:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 2
Всего: 315



проблема возникает скорее всего потому, что вы не кодируете данные перед передачей. 

откуда и как отправляются данные?
PM MAIL WWW   Вверх
g27
Дата 15.11.2009, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 29.9.2007
Где: Vilnius

Репутация: нет
Всего: нет



Pitlord, спасибо. Но ситуация не поменялась.
bars80080, данные идут из формы через ajax. Всмысле не кодируются? Что-то с кодировкой не так?

Это сообщение отредактировал(а) g27 - 15.11.2009, 10:29
PM MAIL Skype   Вверх
Ипатьев
Дата 15.11.2009, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 1
Всего: 37



неужели так сложно написать всего одну строчку,
$search_array=split(" ","ааа ббб+ввв");
var_dump($search_array);
и посмотреть, что она выведет?

как можно заниматься программированием вслепую? 
оперируя не реальными строками, а воображаемыми?


Это сообщение отредактировал(а) Ипатьев - 15.11.2009, 10:41
PM MAIL   Вверх
g27
Дата 15.11.2009, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 29.9.2007
Где: Vilnius

Репутация: нет
Всего: нет



возможно функция декодирования не так работает как надо...

Код

<?php
class Decoder
{
  var $SCRIPT_ENCODING = "utf-8";
  var $SCRIPT_DECODE_MODE = '';
  var $LOADER = null;
  var $ID = null;

  // Internal; uniq value.
  var $_uniqHash;
  // Internal: response content-type depending on loader type.
  var $_contentTypes = array(
    "script" => "text/javascript",
    "xml"    => "text/plain",
    "form"   => "text/html",
    ""       => "text/plain", // for unknown loader
  );

  /**
     * Decode all %uXXXX entities in string or array (recurrent).
     * String must not contain %XX entities - they are ignored!
     */
    function _ucs2EntitiesDecode($data)
    {
        if (is_array($data)) {
            $d = array();
            foreach ($data as $k=>$v) {
                $d[$this->_ucs2EntitiesDecode($k)] = $this->_ucs2EntitiesDecode($v);
            }
            return $d;
        } else {
            $data = str_replace("%20", " ", $data);
            if (strpos($data, '%u') !== false) { // improve speed
                $data = preg_replace_callback('/%u([0-9A-F]{1,4})/si', array(&$this, '_ucs2EntitiesDecodeCallback'), $data);
            }
            return $data;
        }
    }


    /**
     * Decode one %uXXXX entity (RE callback).
     */
    function _ucs2EntitiesDecodeCallback($p)
    {
        $hex = $p[1];
        $dec = hexdec($hex);
        if ($dec === "38" && $this->SCRIPT_DECODE_MODE == 'entities') {
            // Process "&" separately in "entities" decode mode.
            $c = "&amp;";
        } else {
            if (is_callable('iconv')) {
                $c = @iconv('UCS-2BE', $this->SCRIPT_ENCODING, pack('n', $dec));
            } else {
                $c = $this->_decUcs2Decode($dec, $this->SCRIPT_ENCODING);
            }
            if (!strlen($c)) {
                if ($this->SCRIPT_DECODE_MODE == 'entities') {
                    $c = '&#'.$dec.';';
                } else {
                    $c = '?';
                }
            }
        }
        return $c;
    }


    /**
     * If there is no ICONV, try to decode 1-byte characters manually
     * (for most popular charsets only).
     */

    /**
     * Convert from UCS-2BE decimal to $toEnc.
     */
    function _decUcs2Decode($code, $toEnc)
    {
        if ($code < 128) return chr($code);
        if (isset($this->_encTables[$toEnc])) {
            $p = array_search($code, $this->_encTables[$toEnc]);
            if ($p !== false) return chr(128 + $p);
        }
        return "";
    }


    /**
     * UCS-2BE -> 1-byte encodings (from #128).
     */
    var $_encTables = array(
        'windows-1251' => array(
            0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021,
            0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,
            0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
            0x0098, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F,
            0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7,
            0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,
            0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7,
            0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457,
            0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
            0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
            0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
            0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
            0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
            0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
            0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
            0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
        ),
        'koi8-r' => array(
            0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524,
            0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590,
            0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248,
            0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7,
            0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556,
            0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x255C, 0x255d, 0x255E,
            0x255F, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565,
            0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x256B, 0x256C, 0x00A9,
            0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
            0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043d, 0x043E,
            0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
            0x044C, 0x044B, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044A,
            0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
            0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041d, 0x041E,
            0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
            0x042C, 0x042B, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042A
        ),
    );
}
?>

PM MAIL Skype   Вверх
bars80080
Дата 15.11.2009, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 2
Всего: 315



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

имхо, на передаче нету функции encodeURIComponent()
а может есть какие дополнительные обработки

Добавлено через 1 минуту и 48 секунд
п.с. это в дополнение, к тому что сказал Ипатьев
PM MAIL WWW   Вверх
g27
Дата 15.11.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 29.9.2007
Где: Vilnius

Репутация: нет
Всего: нет



Ипатьев, как видите можно. 
Оказалось что + пропадает потом, видимо  + и пробел имеет один и тот же код.
PM MAIL Skype   Вверх
Pitlord
Дата 15.11.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 31.10.2009

Репутация: нет
Всего: 7



Цитата(g27 @  15.11.2009,  12:24 Найти цитируемый пост)
Оказалось что + пропадает потом, видимо  + и пробел имеет один и тот же код. 

Эти 2 символа имеют разный код. Просто при URL-кодировании значений параметров в query string разрешается использовать +, а не %20 вместо пробела. Непонятно только каким образом Вы получаете строку в таком виде, если в массивы $_POST, $_GET попадают уже декодированные значения.
PM MAIL   Вверх
Ипатьев
Дата 15.11.2009, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 1
Всего: 37



g27, как вижу - нельзя. Все разваливается в момент.
При этом не нужно никаких особенных навыков программирования.
Надо просто элементарно проверять свои догадки. 
Только так можно добраться до настоящей причины

PM MAIL   Вверх
g27
Дата 15.11.2009, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 29.9.2007
Где: Vilnius

Репутация: нет
Всего: нет



Код

<div id="search">
<form method="post" onsubmit="specs('/?module=search','center');return false;" >
<input id="search_form" name="search_string" type="text" value="">
<input id="search_submit" type="submit" value="$Lang[362]"></form>
</div>


Код

function specs(var_url, el, obj, var_data, edt, edt1) {
    var_data = var_data || '';
    el = el || '';
    if(obj != '0') {
        obj = obj || document;
        inputElements = obj.getElementsByTagName("input");
        for (var i = 0; i < inputElements.length; i++){
            if(inputElements.item(i).type == "hidden" || inputElements.item(i).type == "text" || inputElements.item(i).type == "password"){
                var_data += inputElements.item(i).name + "=" + escape(inputElements.item(i).value) + "&";
            } else if (inputElements.item(i).type == "checkbox"){
                if(inputElements.item(i).checked){
                    var_data += inputElements.item(i).name + "=1&";
                } else {
                    var_data += inputElements.item(i).name + "=0&";
                }
            } else if (inputElements.item(i).type == "radio"){
                if(inputElements.item(i).checked){
                    var_data += inputElements.item(i).name + "=" + escape(inputElements.item(i).value) + "&";
                }
            }
        }
        selectElements = obj.getElementsByTagName("select");
        for(var i = 0; i < selectElements.length; i++){
            var_data += selectElements.item(i).name + "=" + escape(selectElements.item(i).value) + "&";
        }
        selectedTextAreas = obj.getElementsByTagName("textarea");
        for(var i = 0; i < selectedTextAreas.length; i++){
            var_data += selectedTextAreas.item(i).name + "=" + escape(selectedTextAreas.item(i).value) + "&";
        }
        if(edt){
            var_data += edt + "=" + escape(FCKeditorAPI.GetInstance(edt).GetXHTML()) + "&";
        }
        if(edt1){
            var_data += edt1 + "=" + escape(FCKeditorAPI.GetInstance(edt1).GetXHTML()) + "&";
        }
    }

    if(addressBook.exist){;}
    else{
        addressBook.buildLoader();
        addressBook.exist=1;
    };
    addressBook_info.element=el;
    $.ajax({
       type: "POST",
       url: var_url,
       data: var_data,
       success: function(msg){
        addressBook_info.getdata(msg);
       }
     });
}


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

Это сообщение отредактировал(а) g27 - 15.11.2009, 16:55
PM MAIL Skype   Вверх
bars80080
Дата 15.11.2009, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 2
Всего: 315



вот почему полезно смотреть за тенденциями развития. не с дуру же выкинули ентот escape и поставили заместо него encodeURIComponent

Код

<html>
<body>
<script>
var qw = 'qwe+qwe qwe';
alert(escape(qw));
alert(encodeURIComponent(qw));
</script>
</body>
</html>

escape не кодирует плюсы
PM MAIL WWW   Вверх
g27
Дата 15.11.2009, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 29.9.2007
Где: Vilnius

Репутация: нет
Всего: нет



bars80080, о да, точно. Спасибо!!!
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0643 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.