Как подсветить фразу на html странице php?

237
26 февраля 2017, 10:34

Есть html страница:

<p> какой-то текст найди </p> <p> меня еще какой-то текст </p>

И есть фраза

"найди меня"

Требуется подсветить ее на данной странице. Фраза может пересекаться с любыми тегами, как в примере.

Как вариант должно получиться что-то типа такого:

<p> 
    какой-то текст <span class="red">найди</span> 
</p> 
<p> 
    <span class="red">меня</span> еще какой-то текст
</p>

Как это сделать средствам php?

Answer 1

Можно с помощью регулярных выражений, вот только искать будет только одно слово...

function search_replace($beginText,$search){
    $patterns = "/(".$search.")+/iu"; 
    $replace = "<span style='color:red'><em>$1</em></span>";// На что заменить
    $endText = PREG_REPLACE($patterns,$replace,$beginText);// Замена
    return $endText;
}
echo(searhh_replase("<p> какой-то текст найди </p> <p> меня еще какой-то текст </p>","найди"))
Answer 2

Если нигде не ошибся, то должно работать

$text = 'Длинный текст с тегами';
$match = 'найди меня';
$matchPos = 0;
$opentag = false;
$positions = [];
$curPos = [];
$startPos = 0;
for ($i = 0; $i < strlen($text); $i++) {
  switch ($text[$i]) {
    case '<':
      if ($matchPos > 0)
        $curPos[] = [$startPos, $i];
      $opentag = true;
      break;
    case '>':
      if ($matchPos > 0)
        $startPos = $i;
      $opentag = false;
      break;
    default:
      if (!$opentag) {
        if ($text[$i] === $match[$matchPos]) {
          if ($matchPos === 0)
            $startPos = $i;
          else if ($matchPos === strlen($match) - 1) {
            $curPos[] = [$startPos, $i];
            $positions[] = $curPos;
            $curPos = [];
            $matchPos = 0;
          }
          $matchPos++;
        } else {
          $curPos = [];
          $matchPos = 0;
        }
      }
  }
}
for ($i = count(positions) - 1; $i >= 0; $i--) {
  for ($j = count(positions[i]) -  1; $j >= 0; $j--} {
    $text = substr_replace($text, '</span>', $positions[$i][$j][1]);
    $text = substr_replace($text, '<span class="selected">', $positions[$i][$j][0]);
}
READ ALSO
Как спарсить ответ json

Как спарсить ответ json

get посылаю так:

277
Каким образом обфусцирован этот код? [требует правки]

Каким образом обфусцирован этот код? [требует правки]

Каким способом зашифрован этот код? Обычные обфускаторы либо через eval , либо просто заменой переменных шифруют

221
react.js и WebRTC RTCPeerConnection.addStream is not an object

react.js и WebRTC RTCPeerConnection.addStream is not an object

Я хочу сделать небольшой чат с WebRTC и reactjs

335