Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Вставка текста в строковую переменную из базы


Автор: weldpua2008 10.11.2013, 15:31
Привет всем
Есть wordpress(написан на пхп) и нужно в HTML-текст (из базы данных) вставить строку при этом не попасть в середину служебной информации тега ( < a сюда>, < img  сюда>, style=" сюда")
Но тем не менее я все же не смог реализовать нормальный вариант =( Ведь Я так и не знаю сколько символов я откидываю с помощью strip_tags

Код

<?php
/*
    берем исходный текст из базы данных (в wordpress значение => the_content() )
    этот текст избавляем от html-тегов, теперь отступаем на $pos символов и выбираем один символ $test_letter
    в исходном тексте отступаем на $pos символов и ищем  этот символ ($test_letter)
    оперделяем его позициию, куда и добавляем текст
*/
function adv_add($textToAdd,$pos,$text){
    $nText=mb_strlen($text);
    if($pos==0) $pos++;
    
    $test_letter=mb_substr(trim(strip_tags(html_entity_decode($text))),($pos-1),1);

    while ($pos<$nText){
        if( mb_strrpos(mb_substr($text,($pos-10),3),$test_letter  )!=false ){                
                return mb_substr($text,0,$pos).$textToAdd.mb_substr($text,$pos,($nText-$pos));
        }
    $pos++;    
    }
}

function contentAdd($text){
$nText=mb_strlen($text);// длина текста

    if(($nText> 500) &&is_single()){
        $textToAdd = <<<HTML <div style="float:right;margin:0 0 10px 15px;">This</div> HTML;
        $textToAdd2 = <<<HTML    <div style="width:100%;text-align: center;">This 2</div>    HTML;


        $text1=adv_add($textToAdd,$nu,$text);
        $text2=adv_add($textToAdd2,$nText/2,$text1);

        return "".$text2;
    }

    // по умолчанию возвращаем исходный текст
    return $text;
}
    add_filter('the_content', 'contentAdd', -10);
?>

Автор: weldpua2008 10.11.2013, 18:15
вот попробовал изменить adv_add, но все равно не получается 
Код

function adv_add($textToAdd,$pos,$text){
    $textDec=html_entity_decode($text);
    $text=$textDec;
    $nText=mb_strlen($text);
    $numSimbols=3;
    $subLimit=$numSimbols+3;
    if($pos==0) $pos++;
    $posStart=$pos;
    $textToLetters=trim(strip_tags($textDec));    
    
        $posSpace=mb_strpos(mb_substr($textToLetters,$pos,mb_strlen($textDec)-$pos)," ");            
        //echo $posSpace." ";
        $posSpace+=$pos;
        echo $posSpace." ";
        $posStart=$posSpace+$pos;
        $lim=$posStart+400; if(($lim>$nText)) $lim=$nText;
    do{
        $pos=$posStart;
        $posStart++;
        $test_letter=mb_substr($textToLetters,($pos-1),$numSimbols);
        //echo $test_letter."--";
        
        
        while ($pos<$lim){
            if( mb_strrpos(mb_substr($textDec,($pos-$subLimit),$subLimit),$test_letter  )!=false ){
                    //echo "test_letter".$test_letter."</br>";
                    return mb_substr($text,0,$pos).$textToAdd.mb_substr($text,$pos,($nText-$pos));
                    break;
            }
            $pos++;    
        }
    }while ($posStart<$lim);
    return $text;
}

Автор: ПингвинЪ 10.11.2013, 23:06
Можно попробовать разобрать текст через DOMDocument. И потом вставить нужный текст в любую позицию.

Код

class DOM extends DOMDocument {
    public function saveHTML() {
        $html = parent::saveHTML();
        $html = preg_replace("/(<\/?body>|<\/?html>|<\!DOCTYPE[^>]+>)/", '', $html);
        return $html;
    }
}

$str = '<h1>T1</h1>foo<h1>T2</h1>bar<h1>T3</h1>buz';
$DOM = new DOM();
$DOM->loadHTML($str);

//получим ноды h1
$items = $DOM->getElementsByTagName('h1');

for ($i = 0; $i < $items->length; $i++)
{
    echo $items->item($i)->nodeType == XML_TEXT_NODE ? 'Text' : 'Not text'. " contain: {$items->item($i)->nodeValue}\n";
    echo "Duplicate value\n";
    $items->item($i)->nodeValue .= $items->item($i)->nodeValue;
    echo "After duplicate: {$items->item($i)->nodeValue}\n";
}


echo "new dom:\n" . $DOM->saveHTML();


Запуск

Код

$ php modify_dom.php 
Not text contain: T1
Duplicate value
After duplicate: T1T1
Not text contain: T2
Duplicate value
After duplicate: T2T2
Not text contain: T3
Duplicate value
After duplicate: T3T3
new dom:

<h1>T1T1</h1>foo<h1>T2T2</h1>bar<h1>T3T3</h1>buz

Автор: baldina 11.11.2013, 09:37
Цитата(weldpua2008 @  10.11.2013,  15:31 Найти цитируемый пост)
нужно в HTML-текст (из базы данных) вставить строку

задача сформулирована довольно мутно. т.к. фрагментов отображаемого текста в html может быть несколько. 
а вообще можно регулярными выражениями
Код

function  contentAdd ($text, $textToAdd) {
  return preg_replace('/(?<=^|>)([^><]+?)(?=<|$)/', $text, $textToAdd);
}

Автор: weldpua2008 13.11.2013, 21:04
Цитата(baldina @  11.11.2013,  09:37 Найти цитируемый пост)
задача сформулирована довольно мутно. т.к. фрагментов отображаемого текста в html может быть несколько. 

Получаем в переменной текст+html (результат WP_Query), нужно после определеного слова/символа вставить другой текст. При этом символы относящиеся к html-тегам не учитывать.

ПингвинЪ, baldina - спасибо

Автор: baldina 13.11.2013, 22:07
Цитата(weldpua2008 @  13.11.2013,  21:04 Найти цитируемый пост)
после определеного слова/символа вставить другой текст. При этом символы относящиеся к html-тегам не учитывать

Код

function  contentAdd ($text, $textToAdd, $afterWord) {
   return preg_replace('/(?<=^|>)([^><]*?)('.$afterWord.'\s*)([^><]*?)(?=<|$)/', $text, '$1'.$afterWord.' '.$textToAdd.' $2');
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)