Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вставка текста в строковую переменную из базы 
:(
    Опции темы
weldpua2008
  Дата 10.11.2013, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 28.12.2008

Репутация: нет
Всего: нет



Привет всем
Есть 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);
?>

PM MAIL   Вверх
weldpua2008
Дата 10.11.2013, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 28.12.2008

Репутация: нет
Всего: нет



вот попробовал изменить 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;
}

PM MAIL   Вверх
ПингвинЪ
Дата 10.11.2013, 23:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 3.7.2011

Репутация: нет
Всего: нет



Можно попробовать разобрать текст через 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


Это сообщение отредактировал(а) ПингвинЪ - 10.11.2013, 23:07
PM MAIL   Вверх
baldina
Дата 11.11.2013, 09:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



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

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

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

PM MAIL   Вверх
weldpua2008
Дата 13.11.2013, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 28.12.2008

Репутация: нет
Всего: нет



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

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

ПингвинЪbaldina - спасибо
PM MAIL   Вверх
baldina
Дата 13.11.2013, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



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

Код

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



Это сообщение отредактировал(а) baldina - 13.11.2013, 22:07
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0745 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.