Collections functions
Encryption functions
General functions
Theme permission functions
Resource functions

str_highlight()

Parameters

ColumnTypeDefaultDescription
$text
$needle
$options null
$highlight null

Location

include/search_functions.php lines 2120 to 2194

Definition

 
function str_highlight($text$needle$options null$highlight null)
    {
    
/*
    Sometimes the text can contain HTML entities and can break the hilghlighting feature
    Example: searching for "q&a" in a string like "q&a" will highlight the wrong string
    */
    
$text htmlspecialchars_decode($text);

    
// If text contains HTML tags then ignore them
    
if ($text != strip_tags($text))
        {
        
$options $options STR_HIGHLIGHT_STRIPLINKS;
        }

    
# Thanks to Aidan Lister <aidan@php.net>
    # Sourced from http://aidanlister.com/repos/v/function.str_highlight.php on 2007-10-09
    # License on the website reads: "All code on this website resides in the Public Domain, you are free to use and modify it however you wish."
    # http://aidanlister.com/repos/license/

    
$text=str_replace("_","♠",$text);// underscores are considered part of words, so temporarily replace them for better \b search.
    
$text=str_replace("#zwspace;","♣",$text);
    
    
// Default highlighting
    
if ($highlight === null) {
        
$highlight '||<||\1||>||';
    }
    
    
// Select pattern to use
    
if ($options STR_HIGHLIGHT_SIMPLE) {
        
$pattern '#(%s)#';
        
$sl_pattern '#(%s)#';
    } else {
        
$pattern '#(?!<.*?)(%s)(?![^<>]*?>)#';
        
$sl_pattern '#<a\s(?:.*?)>(%s)</a>#';
    }
    
    
// Case sensitivity
    
if (!($options STR_HIGHLIGHT_CASESENS)) {
        
$pattern .= 'i';
        
$sl_pattern .= 'i';
    }
    
    
$needle = (array) $needle;

    
usort($needle"sorthighlights");

    foreach (
$needle as $needle_s) {
        if (
strlen($needle_s) > 0) {
            
$needle_s preg_quote($needle_s);
            
$needle_s str_replace("#","\\#",$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);
        }
    }
    
$text=str_replace("♠","_",$text);
    
$text=str_replace("♣","#zwspace;",$text);

    
# Fix - do the final replace at the end - fixes a glitch whereby the highlight HTML itself gets highlighted if it matches search terms, and you get nested HTML.
    
$text=str_replace("||<||",'<span class="highlight">',$text);
    
$text=str_replace("||>||",'</span>',$text);

    return 
$text;
    }

This article was last updated 16th July 2020 01:35 Europe/London time based on the source file dated 7th July 2020 15:22 Europe/London time.