За последние 24 часа нас посетили 20906 программистов и 1129 роботов. Сейчас ищут 389 программистов ...

экранирование знаков

Тема в разделе "PHP для новичков", создана пользователем bookin, 13 апр 2011.

  1. bookin

    bookin Активный пользователь

    С нами с:
    11 ноя 2009
    Сообщения:
    120
    Симпатии:
    0
    подскажите как можно экранировать значения типа �, когда json_decode встречает подобные символы то про100 возвращает null, как с этим можно бороться, благодарю
     
  2. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Пример из смарти

    PHP:
    1. <?php
    2. /**
    3. * Smarty plugin
    4. * @package Smarty
    5. * @subpackage plugins
    6. */
    7.  
    8. /**
    9. * Smarty truncate modifier plugin
    10. *
    11. * Type:     modifier<br>
    12. * Name:     truncate<br>
    13. * Purpose:  Truncate a string to a certain length if necessary,
    14. *           optionally splitting in the middle of a word, and
    15. *           appending the $etc string or inserting $etc into the middle.
    16. * @link [url]http://smarty.php.net/manual/en/language.modifier.truncate.php[/url]
    17. *          truncate (Smarty online manual)
    18. * @author   Monte Ohrt <monte at ohrt dot com>
    19. * @param string
    20. * @param integer
    21. * @param string
    22. * @param boolean
    23. * @param boolean
    24. * @return string
    25. */
    26. function smarty_modifier_truncate($string, $length = 80, $etc = '...',
    27.                                   $break_words = false, $middle = false)
    28. {
    29.     if ($length == 0)
    30.         return '';
    31.  
    32.     if (strlen($string) > $length) {
    33.         $length -= min($length, strlen($etc));
    34.         if (!$break_words && !$middle) {
    35.             $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
    36.         }
    37.         if(!$middle) {
    38.             //return substr($string, 0, $length) . $etc;
    39.             return utf8_str_limit($string, $length, $etc);
    40.         } else {
    41.             return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
    42.         }
    43.     } else {
    44.         return $string;
    45.     }
    46. }
    47.  
    48.  
    49. /**
    50. * Обрезает текст в кодировке UTF-8 до заданной длины,
    51. * причём последнее слово показывается целиком, а не обрывается на середине.
    52. * Html сущности корректно обрабатываются.
    53. *
    54. * @param    string   $s           текст в кодировке UTF-8
    55. * @param    int      $maxlength   ограничение длины текста
    56. * @param    string   $continue    завершающая строка, которая будет вставлена после текста, если он обрежется
    57. * @param    string   &$is_cutted  текст был обрезан?
    58. * @return   string
    59. */
    60. function utf8_str_limit($s, $maxlength = 256, $continue = "\xe2\x80\xa6", &$is_cutted = null) #"\xe2\x80\xa6" = "&hellip;"
    61. {
    62.     $is_cutted = false;
    63.     if ($continue === null) $continue = "\xe2\x80\xa6";
    64.  
    65.     #оптимизация скорости:
    66.    #{{{
    67.    if (strlen($s) <= $maxlength) return $s;
    68.     $s2 = str_replace("\r\n", '?', $s);
    69.     $s2 = preg_replace('/&(?> [a-zA-Z][a-zA-Z\d]+
    70.                            | \#(?> \d{1,4}
    71.                                  | x[\da-fA-F]{2,4}
    72.                                )
    73.                          );  # html сущности (&lt; &gt; &amp; &quot;)
    74.                        /sx', '?', $s2);
    75.     #utf8_decode() converts characters that are not in ISO-8859-1 to '?', which, for the purpose of counting, is quite alright.
    76.    if (strlen($s2) <= $maxlength || strlen(utf8_decode($s2)) <= $maxlength) return $s;
    77.     #}}}
    78.  
    79.     preg_match_all('/(?> \r\n   # переносы строк
    80.                       | &(?> [a-zA-Z][a-zA-Z\d]+
    81.                            | \#(?> \d{1,4}
    82.                                  | x[\da-fA-F]{2,4}
    83.                                )
    84.                          );  # html сущности (&lt; &gt; &amp; &quot;)
    85.                       | [\x09\x0A\x0D\x20-\x7E]           # ASCII
    86.                       | [\xC2-\xDF][\x80-\xBF]            # non-overlong 2-byte
    87.                       |  \xE0[\xA0-\xBF][\x80-\xBF]       # excluding overlongs
    88.                       | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
    89.                       |  \xED[\x80-\x9F][\x80-\xBF]       # excluding surrogates
    90.                       |  \xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
    91.                       | [\xF1-\xF3][\x80-\xBF]{3}         # planes 4-15
    92.                       |  \xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
    93.                     )
    94.                    /sx', $s, $m);
    95.     #d($m);
    96.    if (count($m[0]) <= $maxlength) return $s;
    97.     $is_cutted = true;
    98.     $left = implode('', array_slice($m[0], 0, $maxlength));
    99.     #из диапазона ASCII исключаем буквы, цифры, закрывающие парные символы [a-zA-Z\d)}\];]
    100.    #нельзя вырезать в конце строки символ ";", т.к. он используются в сущностях &xxx;
    101.    $left2 = rtrim($left, "\x00..\x28\x2A..\x2F\x3A\x3C\x40\x5C\x5E..\x60\x7C\x7E\x7F");
    102.     if (strlen($left) !== strlen($left2)) return $left2 . $continue;
    103.  
    104.     #добавляем остаток к обрезанному слову
    105.    $right = implode('', array_slice($m[0], $maxlength));
    106.     preg_match('/^(?: [a-zA-Z\d\)\]\}\-\.]  #английские буквы или цифры, закрывающие парные символы, дефис для составных слов, дата, IP-адреса, URL типа [url="http://www.ya.ru"]www.ya.ru[/url]!
    107.                    | \xe2\x80[\x9d\x99]|\xc2\xbb|\xe2\x80\x9c  #закрывающие кавычки
    108.                    | \xc3[\xa4\xa7\xb1\xb6\xbc\x84\x87\x91\x96\x9c]|\xc4[\x9f\xb1\x9e\xb0]|\xc5[\x9f\x9e]  #турецкие
    109.                    | \xd0[\x90-\xbf\x81]|\xd1[\x80-\x8f\x91]   #русские буквы
    110.                    | \xd2[\x96\x97\xa2\xa3\xae\xaf\xba\xbb]|\xd3[\x98\x99\xa8\xa9]  #татарские
    111.                  )+
    112.                /sx', $right, $m);
    113.     #d($m);
    114.    $right = isset($m[0]) ? rtrim($m[0], '.-') : '';
    115.     $s2 = $left . $right;
    116.     if (strlen($s2) !== strlen($s)) $s2 .= $continue;
    117.     return $s2;
    118. }
    119.  
    120. ?>
    Если я правильно тебя понял у меня появлялись иногда символы � и эта штука решила проблему)
     
  3. bookin

    bookin Активный пользователь

    С нами с:
    11 ноя 2009
    Сообщения:
    120
    Симпатии:
    0
    по сути мне надо тока этот код:

    PHP:
    1. '/(?> \r\n  # переносы строк
    2.                       | &(?> [a-zA-Z][a-zA-Z\d]+
    3.                             | \#(?> \d{1,4}
    4.                                   | x[\da-fA-F]{2,4}
    5.                                 )
    6.                           );  # html сущности (&lt; &gt; &amp; &quot;)
    7.                       | [\x09\x0A\x0D\x20-\x7E]          # ASCII
    8.                       | [\xC2-\xDF][\x80-\xBF]            # non-overlong 2-byte
    9.                       |  \xE0[\xA0-\xBF][\x80-\xBF]      # excluding overlongs
    10.                       | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
    11.                       |  \xED[\x80-\x9F][\x80-\xBF]      # excluding surrogates
    12.                       |  \xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
    13.                       | [\xF1-\xF3][\x80-\xBF]{3}        # planes 4-15
    14.                       |  \xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
    15.                     )
    16.                     /sx'
    тока что бы он работал противоположно, ща он косит все кроме символов �, а было бы не плохо косить символы � =)
     
  4. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Ну я и дал его чтобы колеса открутить =) По идеи он должен и от � лечить, ты упустил что то =)
     
  5. bookin

    bookin Активный пользователь

    С нами с:
    11 ноя 2009
    Сообщения:
    120
    Симпатии:
    0
    пока написал так :

    PHP:
    1. <?$unicode=(preg_replace('/(?> \r\n  # переносы строк
    2.                       | &(?> [a-zA-Z][a-zA-Z\d]+
    3.                             | \#(?> \d{1,4}
    4.                                   | x[\da-fA-F]{2,4}
    5.                                 )
    6.                           );  # html сущности (&lt; &gt; &amp; &quot;)
    7.                       | [\x09\x0A\x0D\x20-\x7E]          # ASCII
    8.                       | [\xC2-\xDF][\x80-\xBF]            # non-overlong 2-byte
    9.                       |  \xE0[\xA0-\xBF][\x80-\xBF]      # excluding overlongs
    10.                       | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
    11.                       |  \xED[\x80-\x9F][\x80-\xBF]      # excluding surrogates
    12.                       |  \xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
    13.                       | [\xF1-\xF3][\x80-\xBF]{3}        # planes 4-15
    14.                       |  \xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
    15.                     )
    16.                     /sx','',$result));
    17.     $users=json_decode(preg_replace('['.$unicode.']','',$result));?>
    но это плохое решение ибо если будут как минимум два знака которые не нужны то они слепятся и выдаст ошибку( в регулярках полный дуб(
     
  6. bookin

    bookin Активный пользователь

    С нами с:
    11 ноя 2009
    Сообщения:
    120
    Симпатии:
    0
    preg_replace('{[\x00-\x1f\x{0080}-\x{009F}\x{007F}-\x{009F}\x{D800}-\x{DFFF}]}u','',$result) - пока ошибок не выдало, делает то что надо, через пару миллионов записей будет видно)