Определить нахождение слова внутри тегов

Тема в разделе "PHP", создана пользователем Stripe, 23 апр 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Stripe

    Stripe

    Регистр.:
    21 окт 2007
    Сообщения:
    164
    Симпатии:
    9
    Есть допустим код,
    Допустим слово ДОЛГО у меня везде нужно заменить на слово СИЛЬНО, исключение только в случае нахождения искомого слова внутри указаного тега. Как реализовать такую проверку?
     
  2. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    737
    Симпатии:
    263
    1) Меняем все, что внутри тегов, на base64_encode(его же)
    2) меняем слово на второе слово
    3) меняем все, что внутри тегов на base64_decode(его же)

    У меня была такая же задача, и как видишь, я долго не думал.. Херовый, конечно, способ, но работает. А вероятность встретить в base64_encod'нутом тексте искомое слово стремится к нулю, особенно если у тебя слова русские. Но чтобы до конца себя обезопасить вставляй там % через каждые два символа или еще чего-нить придумай, короче это не проблема.
     
    Stripe нравится это.
  3. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    ещё вариант менять с тегами
    PHP:
    $data '<b>ДОЛГО</b>as ad ad ad sa<p>ДОЛГО</p>';

    $pattern = array();
    $replacement = array();

    //b
    $pattern[] = '/<b>долго<\/b>/iu';
    $replacement[] = '<b>сильно</b>';
    //p
    $pattern[] = '/<p>долго<\/p>/iu';
    $replacement[] = '<p>ясно</p>';

    $data preg_replace($pattern$replacement$data);

    echo 
    $data;
     
  4. Stripe

    Stripe

    Регистр.:
    21 окт 2007
    Сообщения:
    164
    Симпатии:
    9
    venetu, интересный вариант, спасибо! А какие образом можно после каждых двух символов вставить свой текст? например:
    Из этого: мама мыла раму
    Сделать это: ма..ма.. м..ыл..а ..ра..му
    polyetilen, тут понимаешь, слово может быть внутри предложения, которое в теге... в этом и задача что надо опеределить внутри тега или снаружи слово (или фраза), потому что внутри тега может быть куча слов.
     
  5. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    737
    Симпатии:
    263
    Эммм...
    PHP:
    $in "мама мыла раму";
    $step 2;
    $out '';
    for(
    $i=0;$i<strlen($in);$i++) {
      if (
    $i && $i $step == 0$out .= '..';
      
    $out .= $in[$i];
    }
     
    Stripe нравится это.
  6. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    тогда так, идёт поиск и для каждого результата создаётся функция, которая заменяет слова и возвращает обратно.

    PHP:
    $data '<b>привет я так долго искал это</b>as ad <b>привет</b> ad ad sa<p>привет я так долго искал это</p><b>ДОЛГО</b>';

    $pattern = array();
    $replacement = array();
    //индекс это тег
    $pattern['b'] = array('/долго/iu''/это/iu');
    $replacement['b'] = array('сильно''всё');

    $pattern['p'] = array('/долго/iu');
    $replacement['p'] = array('ясно');


    //по тегам
    foreach($pattern as $key=>$value){

        
    $data preg_replace_callback(
          
    '#\<'.$key.'\>(.+?)\<\/'.$key.'\>#siu',
          
    create_function(
            
    '$matches',
            
    'global $pattern,$replacement; return preg_replace($pattern['.$key.'], $replacement['.$key.'], $matches[0]);'
          
    ),
          
    $data
        
    );

    }

    echo 
    $data;

    на выходе будет
    Код:
    <b>привет я так сильно искал всё</b>as ad <b>привет</b> ad ad sa<p>привет я так ясно искал это</p><b>сильно</b>
    
     
    Stripe нравится это.
  7. Stripe

    Stripe

    Регистр.:
    21 окт 2007
    Сообщения:
    164
    Симпатии:
    9
    Парни, спасибо большое! Выручили!

    Добавлено через 34 минуты
    polyetilen, твой код отдает пустую страницу
     
  8. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    это из-за кодировки, делал под utf-8, если не utf-8 то надо убрать флаг u везде

    PHP:
    $data '<b>привет я так долго искал это</b>as ad <b>привет</b> ad ad sa<p>привет я так долго искал это</p><b>ДОЛГО</b>';

    $pattern = array();
    $replacement = array();
    //индекс это тег
    $pattern['b'] = array('/долго/i''/это/i');
    $replacement['b'] = array('сильно''всё');

    $pattern['p'] = array('/долго/i');
    $replacement['p'] = array('ясно');


    //по тегам
    foreach($pattern as $key=>$value){

        
    $data preg_replace_callback(
          
    '#\<'.$key.'\>(.+?)\<\/'.$key.'\>#si',
          
    create_function(
            
    '$matches',
            
    'global $pattern,$replacement; return preg_replace($pattern['.$key.'], $replacement['.$key.'], $matches[0]);'
          
    ),
          
    $data
        
    );

    }

    echo 
    $data
     
    Stripe нравится это.
Статус темы:
Закрыта.