PHP

Highlight matching keyword in a string

public function str_highlight($text, $needle = '', $options = null, $highlight = null) {
      $STR_HIGHLIGHT_SIMPLE = 1;
      $STR_HIGHLIGHT_WHOLEWD = 2;
      $STR_HIGHLIGHT_CASESENS = 0;
      $STR_HIGHLIGHT_STRIPLINKS = 8;
      if (!$needle) {
          return $text;
      }
      // Default highlighting
      if ($highlight === null) {
          $highlight = '<strong class="highlight">\1</strong>';
      }
      // Select pattern to use
      if ($options & $STR_HIGHLIGHT_SIMPLE) {
          $pattern = '#(%s)#';
      } else {
          $pattern = '#(?!<.*?)(%s)(?![^<>]*?>)#';
          $sl_pattern = '#<a\s(?:.*?)>(%s)</a>#';
      }
      // Case sensitivity
      /*
   if ($options ^ $STR_HIGHLIGHT_CASESENS) {
      $pattern .= 'i';
      $sl_pattern .= 'i';
   }
*/
      $pattern .= 'i';
      $sl_pattern .= 'i';
      $needle = (array)$needle;
      if (is_array($needle) && count($needle)) {
          foreach ($needle as $needle_s) {
              $needle_s = preg_quote($needle_s);
              // Escape needle with optional whole word check
              if ($options & $STR_HIGHLIGHT_WHOLEWD) {
                  $needle_s = '\b' . $needle_s . '\b';
              }
              // Strip links
              if ($options & $STR_HIGHLIGHT_STRIPLINKS) {
                  $sl_regex = sprintf($sl_pattern, $needle_s);
                  $text = preg_replace($sl_regex, '\1', $text);
              }
              $regex = sprintf($pattern, $needle_s);
              $text = preg_replace($regex, $highlight, $text);
          }
      }
      return $text;
  }