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

Статус
В этой теме нельзя размещать новые ответы.

Stripe

Участник
Регистрация
20 Окт 2007
Сообщения
164
Реакции
9
Есть допустим код,
<anothertag>привет я так долго искал это</anothertag>
Допустим слово ДОЛГО у меня везде нужно заменить на слово СИЛЬНО, исключение только в случае нахождения искомого слова внутри указаного тега. Как реализовать такую проверку?
 
1) Меняем все, что внутри тегов, на base64_encode(его же)
2) меняем слово на второе слово
3) меняем все, что внутри тегов на base64_decode(его же)

У меня была такая же задача, и как видишь, я долго не думал.. Херовый, конечно, способ, но работает. А вероятность встретить в base64_encod'нутом тексте искомое слово стремится к нулю, особенно если у тебя слова русские. Но чтобы до конца себя обезопасить вставляй там % через каждые два символа или еще чего-нить придумай, короче это не проблема.
 
ещё вариант менять с тегами
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;
 
venetu, интересный вариант, спасибо! А какие образом можно после каждых двух символов вставить свой текст? например:
Из этого: мама мыла раму
Сделать это: ма..ма.. м..ыл..а ..ра..му
polyetilen, тут понимаешь, слово может быть внутри предложения, которое в теге... в этом и задача что надо опеределить внутри тега или снаружи слово (или фраза), потому что внутри тега может быть куча слов.
 
venetu, интересный вариант, спасибо! А какие образом можно после каждых двух символов вставить свой текст? например:
Из этого: мама мыла раму
Сделать это: ма..ма.. м..ыл..а ..ра..му
Эммм...
PHP:
$in = "мама мыла раму";
$step = 2;
$out = '';
for($i=0;$i<strlen($in);$i++) {
  if ($i && $i % $step == 0) $out .= '..';
  $out .= $in[$i];
}
 
polyetilen, тут понимаешь, слово может быть внутри предложения, которое в теге... в этом и задача что надо опеределить внутри тега или снаружи слово (или фраза), потому что внутри тега может быть куча слов.

тогда так, идёт поиск и для каждого результата создаётся функция, которая заменяет слова и возвращает обратно.

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>
 
Парни, спасибо большое! Выручили!

Добавлено через 34 минуты
polyetilen, твой код отдает пустую страницу
 
это из-за кодировки, делал под 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;
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху