Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > рызрыв строки на слова, разделители пробелы


Автор: g27 14.11.2009, 23:58
Здравствуйте. Делаю так.
Код

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

но за разделители принимаются и плюсы, тоесть +. Почему так? Как сделать что бы только по пробелам? Спасибо.

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

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

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

P.S. POSIX-функции, включая split(), не использовал ни разу, поэтому ответить на сам вопрос затрудняюсь.

Автор: bars80080 15.11.2009, 00:58
проблема возникает скорее всего потому, что вы не кодируете данные перед передачей. 

откуда и как отправляются данные?

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

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

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

Автор: g27 15.11.2009, 10:40
возможно функция декодирования не так работает как надо...

Код

<?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
        ),
    );
}
?>

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

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

Добавлено через 1 минуту и 48 секунд
п.с. это в дополнение, к тому что сказал Ипатьев

Автор: g27 15.11.2009, 12:24
Ипатьев, как видите можно. 
Оказалось что + пропадает потом, видимо  + и пробел имеет один и тот же код.

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

Эти 2 символа имеют разный код. Просто при URL-кодировании значений параметров в query string разрешается использовать +, а не %20 вместо пробела. Непонятно только каким образом Вы получаете строку в таком виде, если в массивы $_POST, $_GET попадают уже декодированные значения.

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

Автор: g27 15.11.2009, 16:52
Код

<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 обрабатывает. смотрел в других местах сайта, везде тоже самое.

Автор: bars80080 15.11.2009, 19:40
вот почему полезно смотреть за тенденциями развития. не с дуру же выкинули ентот escape и поставили заместо него encodeURIComponent

Код

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

escape не кодирует плюсы

Автор: g27 15.11.2009, 21:12
bars80080, о да, точно. Спасибо!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)