За последние 24 часа нас посетили 17834 программиста и 1655 роботов. Сейчас ищут 1265 программистов ...

highlight_string и &nbsp

Тема в разделе "HTML и CSS", создана пользователем kostyl, 9 май 2009.

  1. kostyl

    kostyl Guest

    Добрый день. Такая проблема. При использовании подсветки синтаксиса php кода с помощью highlight_string если строка слишком длинная она искажает вид страницы, тоесть не переноситься на другую строку, хотя пробелы имеются в ней имеются. Может &nbsp надо задать какой то определенный стиль? В голове крутиться решение через <wbr> с CSS wbr { display: inline-block; } но это я считаю уродливым решением. Помогите а, люди добрые?
     
  2. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Заменять &nbsp; на пробел. Или написать свою подсветку.
     
  3. kostyl

    kostyl Guest

    Kreker
    спасибо. Думаю проще свой написать...
     
  4. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    А если заменять через регулярку только одиночные пробелы?
    Ведь если мы представим текст в исходном форматировании, то нам нужно, например, 4 пробела (таб) перед началом текста.
    Однако, не только эти 4 пробела представлены в виде &nbsp, но и все остальные пробелы.
    Поэтому, возможно, разумным будет заменять только еденичный пробел через регулярное выражение.
    Например:

    Код (Text):
    1. /[\s]{1}/im
     
  5. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    блин, у меня как что, так сразу регулярное выражение ...
     
  6. kostyl

    kostyl Guest

    Apple
    а если у меня есть &nbsp; а не \s ? то как?
     
  7. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    kostyl, а они пусть остаются nbps-кой, зачем их заменять?
    Ведь перенос срабатывает в случае с пробелом, а если отступ - то не имеет смысла переносить и коверкать код.
     
  8. kostyl

    kostyl Guest

    Apple
    в том то и дело если пробелы в виде ' ' то все переноситься, а если в виде nbps то нет. ТОесть у меня исходный текс с nbps надо заменить все nbps на ' '(тобишь обычные), все кроме четырех подряд...или двух..
     
  9. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Извращение, но работает корректно:

    PHP:
    1. <?php
    2.  
    3. $string = file_get_contents('invpages.com.php');
    4. $string = preg_replace('/[ ]{1}/', '__WHITESPACE__', $string);
    5. $string = preg_replace('/__WHITESPACE__/', ' ', highlight_string($string, true));
    6.  
    7. // Смотрим на хороший результат
    8. echo $string;
    9.  
    10. ?>
     
  10. kostyl

    kostyl Guest

    Пробую так, но тоже не выходит:
    PHP:
    1. <?php
    2. $sText = preg_replace('/\w{1}(&nbsp;){1}\w{1}/iu', '$1 ', $sText);
    3.  
     
  11. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Конечно не работает.
    Знаете как звучит ваш пример словами?

    Найти любую одну букву, после которой следует один пробел и другая одна буква, а потом заменить её на НАЙДЕННЫЙ ПРОБЕЛ.

    Я же написал работающий выше пример.
    Он корректно обрабатывает все переносы.
    Вообще, регулярные выражения не решают всех проблем, иногда приходится строить логику, как в случае вложенных тегов, например <b>text<b>something<b>Last</b>abc</b></b>
    Ни одно регулярное выражение одним проходом не сможет правильно заменить это. для этого существует callback фунцкия, а также preg_match учет в цикле.

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

    kostyl Guest

    конечный автомат... ;)
     
  13. kostyl

    kostyl Guest

    Apple
    Ты не понял у меня изначально все пробелы через &nbsp; но в той регулярке что выше я писал в скобках движок форума не отобразил &nbsp; почемуто... У меня нет голых пробелов, мне их надо получить из &nbsp; и только там где к &nbsp; не премыкают другие &nbsp; с обоих сторон...
     
  14. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Все пробелы, что вы написали, опять порезались, но на этот раз я понял.
    Однако, хочу задать один единственный вопрос:

    http://www.php.ru/forum/viewtopic.php?p=156556#156556
    Это решение не работает разве?
    Оно построену как раз по тому принципу, который вы сейчас снова описали:
    Заменяет &nbsp; на пробелы, причем только еденичные.
    Вы попробуйте и посмотрите на результат: как раз именно то, что вы описали.
    А ваше регулярное выражение МНЕ КАЖЕТСЯ неподходящим для этой задачи из-за [\w]{1}
    Потому что в конце у нас может быть точка с запятой и пробел, и оно не сработает.
     
  15. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Такое впечатление, что ты позабывал половину слов и оставил место на "как вспомню", а потом забыл вписать )

    Я бы сделал так:
    1. Подсвечиваешь
    2. Заменяешь тройные &nbsp; на &emsp;
    3. Заменяешь одинарные &nbsp; на пробел
     
  16. kostyl

    kostyl Guest

    Kreker
    Да. Так пожалуй лучше... Благодарю. А phpBB вырезает & n b s p ;
     
  17. kostyl

    kostyl Guest

    Kreker
    только вот опера не & e m s p не курит (
     
  18. kostyl

    kostyl Guest

    PHP:
    1.  
    2. <?php
    3.     $sText = highlight_string($sText, TRUE);
    4.     $sText = preg_replace('/&nbsp/iu', ' ', $sText);//точкусзапятой не поставил, потому что браузер сжирает
    5.     return preg_replace('/\x20\x20\x20\x20/iu', '&nbsp&nbsp&nbsp&nbsp', $sText);//аналогично четыре точкисзапятой
    6.