За последние 24 часа нас посетили 15777 программистов и 1544 робота. Сейчас ищут 886 программистов ...

Найти позицию с условием

Тема в разделе "PHP для новичков", создана пользователем VLK, 28 май 2014.

  1. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Смотрите, есть переменная в ней текст, каждый раз разный, в этом тексте допускаются html теги, мне надо начинаю допустим от 100 позиции найти пробел и самое главное что бы этот пробел не попадал в список параметров (атрибутов) html тега, вставить какое то значение.
    В частности речь идет о "Читать дальше..", "Полный текст.."..

    Конкретно на примере, допустим не 100 позиция, а 10-я:

    Код (PHP):
    1. // переменная
    2. $insert = 'Читать дальше..';
    3. $str = 'Hello <span name="myspan" id="myspan" style="....">world!</span>';
    4. // если просто поиск и замена пробела, то 'Читать дальше..' попадет между '<span' и 'name="myspan"'
    5. // что совсем не правильно, т.е. примерно так будет выглядеть:
    6. // $str = 'Hello <span Читать дальше.. name="myspan" id="myspan" style="....">world!</span>'; 
    7.  
    8. // а меня устроит если эта позиция будет после закрытия тега span, перед world, т.е.:
    9. // $str = 'Hello <span name="myspan" id="myspan" style="...."> Читать дальше.. world!</span>';
    10. // примерно как то так
    11.  
    подскажите, как решить эту проблему?
     
  2. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Сейчас думать нет времени, просто не могу понять зачем тебе это требуется?
    Что ты делаешь?
     
  3. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    странно, я же вроде все описал, к примеру, есть новостной сайт, выводятся на главной странице последние 10 новостей, но не весь контент, а первые 10 слов, после чего идет ссылка на саму новость в виде "читать дальше", я хочу это автоматизировать.

    мне надо вычислить куда вставить эту ссылку "читать дальше".
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    А тебе их html нужен?
    Может отбросишь html теги и задача упростится?
    http://php.ru/manual/function.strip-tags.html

    Добавлено спустя 1 минуту 14 секунд:
    правда нужно что бы html был валидным.
     
  5. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    ХТМЛ к сожалению (в данном случае) нужен
     
  6. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Непонятно (((
    Удачи.
     
  7. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    И слова "Читать дальше.." будут стилизованы, как и "world"? Пф. Не красиво. Может, ты имел ввиду
    'Hello Читать дальше.. <span name="myspan" id="myspan" style="....">world!</span>'
    ? Хотя тогда и "world" в теге span не имеет смысла выводить.


    Или же такой случай
    Код (Text):
    1. Hi people of <span name="myspan" id="myspan" style="....">the world</span>!
    когда в пробел между "the world" нужно вставить "Читать дальше...", то правильней (практичней, логичней) было бы получить такой результат
    Код (Text):
    1. Hi people of <span name="myspan" id="myspan" style="....">the</span> Читать дальше...
     
  8. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Мне надо обрубить текст, и что бы это обрубание не попало в "настройки" HTML тега (атрибуты), т.к. этот текст может их содержать, например как это сделано на главной странице php.ru, только там нет "читать дальше" и нет HTML тегов, а у меня будет :))

    я думал есть какая то регулярка или типа того, но как я понимаю ее нет.
     
  9. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    может сможешь сделать строковыми функциями?
     
  10. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    В джумле, чтобы сделать такое, ставится в текст специальный маркер. Все, что до него, выносится в краткий анонс.
     
  11. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    VLK, зацени
    Код (PHP):
    1. <?php
    2. header('Content-Type: text/plain');
    3.  
    4. $insert = 'Читать дальше...';
    5. //$str = 'Hello <span name="myspan" id="myspan" style="....">world!</span>';
    6. $str = 'Hello <span class="foo">people <span name="myspan" id="myspan" style="....">of</span> Earth</span>!';
    7.  
    8. $dom = new DOMDocument;
    9. $dom->loadHTML('<body>'.$str.'</body>');
    10. $dom->preserveWhiteSpace = false;
    11. $body = $dom->getElementsByTagName('body');
    12.  
    13.  
    14. function showDom($element, $maxlen, &$strlen=0){
    15.     $out = '';
    16.     switch($element->nodeType){
    17.         case 1:// node
    18.             $outInner = '';
    19.             foreach ($element->childNodes as $child){
    20.                 $outInner .= showDom($child, $maxlen, $strlen);
    21.             }
    22.             if(!empty($outInner)){
    23.                 $attr = array();
    24.                 foreach($element->attributes as $value){
    25.                     $attr[] = $value->name.'="'.$value->value.'"';
    26.                 }
    27.                 if(count($attr)){
    28.                     array_unshift($attr, '');
    29.                 }
    30.                 $out .= '<'.$element->nodeName.implode(' ', $attr).'>';
    31.                 $out .= $outInner;
    32.                 $out .= '</'.$element->nodeName.'>';
    33.             }
    34.             break;
    35.         case 3:// text
    36.             $words = explode(' ', $element->nodeValue);
    37.             $cntr = 0;
    38.             foreach($words as $word){
    39.                 $strlen += mb_strlen($word);
    40.                 if($strlen < $maxlen){
    41.                     $cntr ++;
    42.                 }
    43.             }
    44.             $out .= implode(' ', array_slice($words, 0, $cntr));
    45.             break;
    46.         default:// ?
    47.             //echo $element->nodeType, ':', $element->nodeValue, "\n";
    48.     }
    49.     return $out;
    50. }
    51.  
    52.  
    53. for($x=5; $x<23; $x++){
    54.     $out = showDom($body->item(0), $x);
    55.     $out = preg_replace('/<\/?body>/', '', $out);
    56.     echo "\n===========maxlen:$x============\n";
    57.     echo $out.' '.$insert;
    58. } 
    Если разберёшься, то, наверное, дополнительные ограничения на длину строк сам поставишь?
     
  12. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    YSandro спасибо