Смотрите, есть переменная в ней текст, каждый раз разный, в этом тексте допускаются html теги, мне надо начинаю допустим от 100 позиции найти пробел и самое главное что бы этот пробел не попадал в список параметров (атрибутов) html тега, вставить какое то значение. В частности речь идет о "Читать дальше..", "Полный текст..".. Конкретно на примере, допустим не 100 позиция, а 10-я: Код (PHP): // переменная $insert = 'Читать дальше..'; $str = 'Hello <span name="myspan" id="myspan" style="....">world!</span>'; // если просто поиск и замена пробела, то 'Читать дальше..' попадет между '<span' и 'name="myspan"' // что совсем не правильно, т.е. примерно так будет выглядеть: // $str = 'Hello <span Читать дальше.. name="myspan" id="myspan" style="....">world!</span>'; // а меня устроит если эта позиция будет после закрытия тега span, перед world, т.е.: // $str = 'Hello <span name="myspan" id="myspan" style="...."> Читать дальше.. world!</span>'; // примерно как то так подскажите, как решить эту проблему?
странно, я же вроде все описал, к примеру, есть новостной сайт, выводятся на главной странице последние 10 новостей, но не весь контент, а первые 10 слов, после чего идет ссылка на саму новость в виде "читать дальше", я хочу это автоматизировать. мне надо вычислить куда вставить эту ссылку "читать дальше".
А тебе их html нужен? Может отбросишь html теги и задача упростится? http://php.ru/manual/function.strip-tags.html Добавлено спустя 1 минуту 14 секунд: правда нужно что бы html был валидным.
И слова "Читать дальше.." будут стилизованы, как и "world"? Пф. Не красиво. Может, ты имел ввиду 'Hello Читать дальше.. <span name="myspan" id="myspan" style="....">world!</span>' ? Хотя тогда и "world" в теге span не имеет смысла выводить. Или же такой случай Код (Text): Hi people of <span name="myspan" id="myspan" style="....">the world</span>! когда в пробел между "the world" нужно вставить "Читать дальше...", то правильней (практичней, логичней) было бы получить такой результат Код (Text): Hi people of <span name="myspan" id="myspan" style="....">the</span> Читать дальше...
Мне надо обрубить текст, и что бы это обрубание не попало в "настройки" HTML тега (атрибуты), т.к. этот текст может их содержать, например как это сделано на главной странице php.ru, только там нет "читать дальше" и нет HTML тегов, а у меня будет ) я думал есть какая то регулярка или типа того, но как я понимаю ее нет.
В джумле, чтобы сделать такое, ставится в текст специальный маркер. Все, что до него, выносится в краткий анонс.
VLK, зацени Код (PHP): <?php header('Content-Type: text/plain'); $insert = 'Читать дальше...'; //$str = 'Hello <span name="myspan" id="myspan" style="....">world!</span>'; $str = 'Hello <span class="foo">people <span name="myspan" id="myspan" style="....">of</span> Earth</span>!'; $dom = new DOMDocument; $dom->loadHTML('<body>'.$str.'</body>'); $dom->preserveWhiteSpace = false; $body = $dom->getElementsByTagName('body'); function showDom($element, $maxlen, &$strlen=0){ $out = ''; switch($element->nodeType){ case 1:// node $outInner = ''; foreach ($element->childNodes as $child){ $outInner .= showDom($child, $maxlen, $strlen); } if(!empty($outInner)){ $attr = array(); foreach($element->attributes as $value){ $attr[] = $value->name.'="'.$value->value.'"'; } if(count($attr)){ array_unshift($attr, ''); } $out .= '<'.$element->nodeName.implode(' ', $attr).'>'; $out .= $outInner; $out .= '</'.$element->nodeName.'>'; } break; case 3:// text $words = explode(' ', $element->nodeValue); $cntr = 0; foreach($words as $word){ $strlen += mb_strlen($word); if($strlen < $maxlen){ $cntr ++; } } $out .= implode(' ', array_slice($words, 0, $cntr)); break; default:// ? //echo $element->nodeType, ':', $element->nodeValue, "\n"; } return $out; } for($x=5; $x<23; $x++){ $out = showDom($body->item(0), $x); $out = preg_replace('/<\/?body>/', '', $out); echo "\n===========maxlen:$x============\n"; echo $out.' '.$insert; } Если разберёшься, то, наверное, дополнительные ограничения на длину строк сам поставишь?