За последние 24 часа нас посетили 15693 программиста и 1656 роботов. Сейчас ищут 936 программистов ...

Проблема с длинной строки

Тема в разделе "Прочие вопросы по PHP", создана пользователем RedSpirit, 31 мар 2013.

  1. RedSpirit

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

    С нами с:
    31 мар 2013
    Сообщения:
    9
    Симпатии:
    0
    В первый раз сталкиваюсь с подобной проблемой.
    Работаю на MODX, в сниппете параметром возвращается строка, на экран вывести ее можно, но операцию сравнения провести нельзя, потому strlen() строки всегда возвращает значение 14. Какой бы ни была строка, хоть пустой хоть длинной, ее размер всегда показывается 14. Тоже самое показывает var_dump.
    Необходимо провести сравнение строки с пустой строкой, но это не получается. Empty() тоже показывает, что строка не пустая.
    Вопрос: как привести эту странную строку к нормальному виду, а точнее взять ее реальный размер? Может кто сталкивался.
     
  2. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Может там спец символы? Проверял?
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    заюзайте mb_strlen какойнить
     
  4. RedSpirit

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

    С нами с:
    31 мар 2013
    Сообщения:
    9
    Симпатии:
    0
    Мультибайтовый вариант показывает тоже самое 14.
    Как проверить на спецсимволы, не думаю, что они тут есть. Var_dump показывает: string(14) ""
    Решил извратится так:
    $str = print_r($str, true); - типа вернуть печатное значение, не помогло, возвращает тоже самое =)
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    хмм. забава. может ты не ту переменную написал, ну там описачка бываед...
     
  6. r3l0c

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

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    А строка откуда берется? Код сниппета, ну или кусочек можно увидеть?)
     
  7. RedSpirit

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

    С нами с:
    31 мар 2013
    Сообщения:
    9
    Симпатии:
    0
    Это какая-то хитрость или особенность работы с MODX, а точнее с его шаблонизатором, параметр указывается прямо в шаблоне, где он в свою очередь берется из значение placeholder-а... короче, зашел в дремучий лес.

    Засунул свою строку (типа пустую) в JSON: json_encode(array('zzz'=>$str))
    Смотрю var_dump: string(24) "{"zzz":""}" - все равно не хочет показывать правильно. mb_strlen тоже показывает 24, хотя по факту 12
    Или вот другая строка из того же параметра: string(24) "{"zzz":"Магазин Ника раз два три"}" - а должно быть 36 =)

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

    Добавлено спустя 6 минут 18 секунд:
    Кусок шаблона:
    Код (Text):
    1. <title>[[!getTitle? &title=`[[+sitetitle]]`]]</title>
    Сниппет:
    Код (Text):
    1. <?php
    2. $t = $modx->getOption('title', $scriptProperties, '');
    3. $sname =  $modx->getOption('site_name');
    4. $ptitle = $modx->resource->get('pagetitle');
    5.  
    6. return empty($t) ? $ptitle.' - '.$sname : $t;
    Замысел простой, если в шаблоне &title не пустой, то выводим его, иначе выводим Имя сайта и Заголовок страницы
     
  8. r3l0c

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

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    А что если попробовать получить доступ ко всем символам поотдельности? =) Мне просто интересно. И еще, что если попробовать вывести 24 и 25-й символы? Может там EOL спрятался?

    MODX не Evo я надеюсь? =))

    Еще мысля у меня ---отпишите плз плейсхолдер- не 24-ли символа он? =))

    Добавлено спустя 54 секунды:
    Короч в эво и рево парсеры работают по-разному, в рево работает рекурсивно. Так что скорее всего у вас эво =)

    Добавлено спустя 1 минуту 41 секунду:
    короч расписал ход мысли епт%)
     
  9. RedSpirit

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

    С нами с:
    31 мар 2013
    Сообщения:
    9
    Симпатии:
    0
    Слава богу у меня MODX Revolution 2.2.6 =)

    Плейсхолдер устанавливается только на некоторых страницах, где нужен конкретный тайтл (в сеошных целях). Просто берется из базы
    Код (Text):
    1. $modx->setPlaceholder('sitetitle', $row['meta_title']);
    Сейчас попробую как-нибудь посимвольно разобрать строку...
     
  10. r3l0c

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

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
  11. RedSpirit

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

    С нами с:
    31 мар 2013
    Сообщения:
    9
    Симпатии:
    0
    Лол... результаты такие:
    Одну и ту же переменную строку сначала разобрал по символам:
    Код (Text):
    1. preg_match_all('/./iu', $t, $a);
    2. print_r($a[0]);
    3.  
    4. Array
    5. (
    6.     [0] => [
    7.     [1] => [
    8.     [2] => +
    9.     [3] => s
    10.     [4] => i
    11.     [5] => t
    12.     [6] => e
    13.     [7] => t
    14.     [8] => i
    15.     [9] => t
    16.     [10] => l
    17.     [11] => e
    18.     [12] => ]
    19.     [13] => ]
    20. )
    А затем просто вывел:
    Код (Text):
    1. var_dump($t);
    2. string(14) "Магазин Ника раз два три"
    Подскажите, то сделать? Это не укладывается в мое мировоззрение. Как узнать реальный размер строки ("Магазин Ника раз два три")?
     
  12. r3l0c

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

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    Магия MODx
    Тут точно нужна бутылка xD. Ща подумаем

    Добавлено спустя 52 секунды:
    Решение --передавать плейсхолдер в сниппет

    Добавлено спустя 17 секунд:
    По крайней мере стоит попробовать xD

    Добавлено спустя 12 минут 49 секунд:
    Я запутался окончательно. У меня небыло подобных проблем никогда =\.

    Добавлено спустя 4 минуты 1 секунду:
    хм, а если вынести [[+sitetitle]] в отдельный чанк?)
    А потом просто $t=$modx->getChunk('чанк_с_тем_самым_плейсхолдером');
    По-сути там будет уже обработанный текст, а так как там просто плейсхолдер - то будет либо пусто, либо нет

    Добавлено спустя 10 секунд:
    Отсюда и прыгать

    Добавлено спустя 1 минуту 54 секунды:
    И кста плейсхолдер лучше прописывать в некешируемом варианте, может и в этом дело, хз
     
  13. RedSpirit

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

    С нами с:
    31 мар 2013
    Сообщения:
    9
    Симпатии:
    0
    Вот я кстати пытался взять значение прямо из сниппета, типа:
    Код (Text):
    1. $value = $modx->getPlaceholder('MyPlaceholder');
    Но всегда возвращается пустое значение. Видимо причина в порядке обработки шаблона, то есть этот код обрабатывается раньше, чем плейсхолдер ставится... что навело меня на мысль пересмотреть структуру.
     
  14. r3l0c

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

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    В общем произвольные плейсхолдеры видимо обрабатываются в последнюю очередь, отсюда косяк. Может TV попробовать на крайняк?

    Добавлено спустя 1 минуту 45 секунд:
    Просто хз, я над модексом вообще извращался, и подобное делал, НО у меня не было подобных проблем. Версия MODx та-же. 2.2.6pl
     
  15. RedSpirit

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

    С нами с:
    31 мар 2013
    Сообщения:
    9
    Симпатии:
    0
    Хмм... про чанк хорошая идея, сейчас попробую
     
  16. r3l0c

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

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    $value = $modx->getPlaceholder('MyPlaceholder');
    сам плейсхолдер вынести в чанк, и обработать парсером с помощью getChunk, на выходе получим не плейсхолдер, а его значение.
     
  17. RedSpirit

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

    С нами с:
    31 мар 2013
    Сообщения:
    9
    Симпатии:
    0
    Сделал по схеме с чанком... тоже самое! Выдает значение: string(14) ""
    Я сдаюсь -_- Буду пересматривать реализацию
     
  18. r3l0c

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

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    Ахахах :D
    Попробуй TV заюзать, перед тем как совсем уж сдаваться, попробуй xD
     
  19. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Код (PHP):
    1. <?php
    2. // file charset is windows-1251
    3. $s = 'Магазин Ника раз два три';
    4. echo mb_strlen($s)."\n"; // 24
    5. echo mb_strlen($s)."\n"; // 9
    и теперь вот так (найди три отличия)
    Код (PHP):
    1. <?php
    2. // file charset is UTF-8
    3. $s = 'Магазин Ника раз два три';
    4. echo mb_strlen($s)."\n"; // 44
    5. echo mb_strlen($s)."\n"; // 24
    6.  
    правильный результат только в последней строке, т.к.
    - кодировка utf-8
    - мы уведомили PHP, что кодировка utf-8

    var_dump всегда говорит длину в байтах, а не в символах. ему плевать на кодировку.

    а как обстоят дела с твоим MODX: реально какая кодировка, если UTF-8, устанавливается ли где-нибудь internal encoding???
     
  20. RedSpirit

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

    С нами с:
    31 мар 2013
    Сообщения:
    9
    Симпатии:
    0
    Сходил проветрился и догнал решение.
    Можно на странице (в ресурсе) поставить:
    Код (Text):
    1. $modx->resource->set('pagetitle', 'Мой заголовок для страницы');
    А потом в сниппите на шаблоне вызвать:
    Код (Text):
    1. $ptitle = $modx->resource->get('pagetitle');
    Если заголовок не устанавливается, то остается как был по-умолчанию заголовком ресурса. Профит!

    r3l0c, спасибо за советы и подсказки! =)
     
  21. r3l0c

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

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    Тут не в кодироваках дело =). http://php.ru/forum/viewtopic.php?f=2&t=44076#p352619
     
  22. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    черная магия?
     
  23. r3l0c

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

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    MODx он такой ;). В переменной находится не пропарсеный слейсхолдер, возвращаем его снппетом в шаблон, и парсер его уже там заменяет).

    Добавлено спустя 31 секунду:
    Просто произвольные слейсхолдеры модекс парсит в последнюю очередь