PHP Australia Conference 2015

str_ireplace

(PHP 5)

str_ireplaceGroß- und kleinschreibungsunabhängige Version von str_replace()

Beschreibung

mixed str_ireplace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )

Die Funktion gibt einen String oder ein Array zurück, in dem alle Vorkommen von search innerhalb von subject unabhängig von deren Groß- oder Kleinschreibung gegen den entsprechenden replace-Wert ausgetauscht wurden. Sofern Sie keine speziellen Ersetzungsregeln verwenden, sollten Sie diese Funktion grundsätzlich anstelle von preg_replace() mit i-Modifier verwenden.

Parameter-Liste

Wenn der search und replace Arrays sind, nimmt str_ireplace() einen Wert von jedem Array und sucht/ersetzt mit diesen im subject. Wenn replace weniger Werte als search besitzt, wird eine leere Zeichenkette für die verbleibenden Ersetzungswerte verwendet. Wenn search ein Array ist und replace eine Zeichenkette, wird dieser Ersetzungswert für alle Werte des search genutzt. Die Umkehrung jedoch wäre sinnlos.

Wenn search oder replace Array sind, werden ihre Elemente in aufsteigender Reihenfolge bearbeitet.

search

Der gesuchte Wert, auch Nadel (needle) genannt. Ein Array kann genutzt werden, um mehrere Nadeln zu bestimmen.

replace

Der Ersetzungswert, der gefundene search Werte ersetzt. Ein Array kann genutzt werden, um mehrere Nadeln zu bestimmen.

subject

Die zu durchsuchende und darin ersetzende Zeichenkette oder das Array, auch Heuhaufen (haystack) genannt.

Ist subject ein Array, wird die Suchen-Ersetzen-Funktionalität auf jedes Element von subject angewendet. Die Funktion gibt dann natürlich ein Array zurück.

count

Falls übergeben, wird dies auf die Anzahl der durchgeführten Ersetzungen gesetzt.

Rückgabewerte

Gibt eine Zeichenkette oder ein Array mit ersetzten Werten zurück.

Changelog

Version Beschreibung
5.0.0 Der Parameter count wurde hinzugefügt.

Beispiele

Beispiel #1 str_ireplace()-Beispiel

<?php
$bodytag 
str_ireplace("%body%""schwarz""<body text=%BODY%>");
?>

Anmerkungen

Hinweis: Diese Funktion ist binary safe.

Achtung

Reihenfolge der Ersetzungen Überraschung

Weil str_ireplace() von links nach rechts ersetzt, kann sie einen zuvor eingesetzten Wert ersetzen, falls mehrere Ersetzungen durchgeführrt werden. Beispiel #2 in der Dokomenation von str_replace() zeigt, wie dies sie in der Praxis betreffen kann.

Siehe auch

  • str_replace() - Ersetzt alle Vorkommen des Suchstrings durch einen anderen String
  • preg_replace() - Sucht und ersetzt mit regulären Ausdrücken
  • strtr() - Tauscht Zeichen aus oder ersetzt Zeichenketten

add a note add a note

User Contributed Notes 10 notes

up
4
daevid at daevid dot com
9 years ago
here's a neat little function I whipped up to do HTML color coding of SQL strings.

<?php
/**
* Output the HTML debugging string in color coded glory for a sql query
* This is very nice for being able to see many SQL queries
* @access     public
* @return     void. prints HTML color coded string of the input $query.
* @param     string $query The SQL query to be executed.
* @author     Daevid Vincent [daevid@LockdownNetworks.com]
*  @version     1.0
* @date        04/05/05
* @todo     highlight SQL functions.
*/
function SQL_DEBUG( $query )
{
    if(
$query == '' ) return 0;

    global
$SQL_INT;
    if( !isset(
$SQL_INT) ) $SQL_INT = 0;

   
//[dv] this has to come first or you will have goofy results later.
   
$query = preg_replace("/['\"]([^'\"]*)['\"]/i", "'<FONT COLOR='#FF6600'>$1</FONT>'", $query, -1);

   
$query = str_ireplace(
                            array (
                                   
'*',
                                   
'SELECT ',
                                   
'UPDATE ',
                                   
'DELETE ',
                                   
'INSERT ',
                                   
'INTO',
                                   
'VALUES',
                                   
'FROM',
                                   
'LEFT',
                                   
'JOIN',
                                   
'WHERE',
                                   
'LIMIT',
                                   
'ORDER BY',
                                   
'AND',
                                   
'OR ', //[dv] note the space. otherwise you match to 'COLOR' ;-)
                                   
'DESC',
                                   
'ASC',
                                   
'ON '
                                 
),
                            array (
                                   
"<FONT COLOR='#FF6600'><B>*</B></FONT>",
                                   
"<FONT COLOR='#00AA00'><B>SELECT</B> </FONT>",
                                   
"<FONT COLOR='#00AA00'><B>UPDATE</B> </FONT>",
                                   
"<FONT COLOR='#00AA00'><B>DELETE</B> </FONT>",
                                   
"<FONT COLOR='#00AA00'><B>INSERT</B> </FONT>",
                                   
"<FONT COLOR='#00AA00'><B>INTO</B></FONT>",
                                   
"<FONT COLOR='#00AA00'><B>VALUES</B></FONT>",
                                   
"<FONT COLOR='#00AA00'><B>FROM</B></FONT>",
                                   
"<FONT COLOR='#00CC00'><B>LEFT</B></FONT>",
                                   
"<FONT COLOR='#00CC00'><B>JOIN</B></FONT>",
                                   
"<FONT COLOR='#00AA00'><B>WHERE</B></FONT>",
                                   
"<FONT COLOR='#AA0000'><B>LIMIT</B></FONT>",
                                   
"<FONT COLOR='#00AA00'><B>ORDER BY</B></FONT>",
                                   
"<FONT COLOR='#0000AA'><B>AND</B></FONT>",
                                   
"<FONT COLOR='#0000AA'><B>OR</B> </FONT>",
                                   
"<FONT COLOR='#0000AA'><B>DESC</B></FONT>",
                                   
"<FONT COLOR='#0000AA'><B>ASC</B></FONT>",
                                   
"<FONT COLOR='#00DD00'><B>ON</B> </FONT>"
                                 
),
                           
$query
                         
);

    echo
"<FONT COLOR='#0000FF'><B>SQL[".$SQL_INT."]:</B> ".$query."<FONT COLOR='#FF0000'>;</FONT></FONT><BR>\n";

   
$SQL_INT++;

}
//SQL_DEBUG
?>
up
3
hfuecks at nospam dot org
9 years ago
Note that character case is being defined by your server's locale setting, which effects strings containing non-ASCII characters.

See strtolower() - http://www.php.net/strtolower and comments - internally str_ireplace converts $search and $replace to lowercase to find matches.
up
3
sawdust
5 years ago
Here's a different approach to search result keyword highlighting that will match all keyword sub strings in a case insensitive manner and preserve case in the returned text. This solution first grabs all matches within $haystack in a case insensitive manner, and the secondly loops through each of those matched sub strings and applies a case sensitive replace in $haystack. This way each unique (in terms of case) instance of $needle is operated on individually allowing a case sensitive replace to be done in order to preserve the original case of each unique instance of $needle.

<?php
function highlightStr($haystack, $needle, $highlightColorValue) {
    
// return $haystack if there is no highlight color or strings given, nothing to do.
   
if (strlen($highlightColorValue) < 1 || strlen($haystack) < 1 || strlen($needle) < 1) {
        return
$haystack;
    }
   
preg_match_all("/$needle+/i", $haystack, $matches);
    if (
is_array($matches[0]) && count($matches[0]) >= 1) {
        foreach (
$matches[0] as $match) {
           
$haystack = str_replace($match, '<span style="background-color:'.$highlightColorValue.';">'.$match.'</span>', $haystack);
        }
    }
    return
$haystack;
}
?>
up
1
ishutko at gmail dot com
5 years ago
For function work with cirilic

setlocale (LC_ALL, 'ru_RU');
up
1
stepanic dot matija at gmail dot com
3 years ago
FIX-ed problem with highlighting second 'o' OR 'a', in this string

<?php
function highlight_string ($haystack, $needle, $highlight_class) {
        
// return $haystack if there is no highlight color or strings given, nothing to do.
       
       
$first_encode='XXXXXXXXXXXXXXX';     //ENCODE string

       
$second_encode='YYYYYYYYYYYYYYY';
       
       
preg_match_all("/$needle+/i", $haystack, $matches);
        if (
is_array($matches[0]) && count($matches[0]) >= 1) {
            foreach (
$matches[0] as $match) {
               
$haystack = str_replace($match, $first_encode.$match.$second_encode, $haystack);
            }
        }
       
       
$haystack=str_replace(array($first_encode,$second_encode),
array(
'<font class="'.$highlight_class.'" >','</font>'),$haystack);
       
        return
$haystack;
}
?>
up
0
aidan at php dot net
10 years ago
This functionality is now implemented in the PEAR package PHP_Compat.

More information about using this function without upgrading your version of PHP can be found on the below link:

http://pear.php.net/package/PHP_Compat
up
-1
Michael dot Bond at mail dot wvu dot edu
5 years ago
This function will highlight search terms (Key Words in Context).

The difference between this one and the ones below is that it will preserve the original case of the search term as well. So, if you search for "american" but in the original string it is "American" it will retain the capital "A" as well as the correct case for the rest of the string.

<?php
function kwic($str1,$str2) {
   
   
$kwicLen = strlen($str1);

   
$kwicArray = array();
   
$pos          = 0;
   
$count       = 0;

    while(
$pos !== FALSE) {
       
$pos = stripos($str2,$str1,$pos);
        if(
$pos !== FALSE) {
           
$kwicArray[$count]['kwic'] = substr($str2,$pos,$kwicLen);
           
$kwicArray[$count++]['pos']  = $pos;
           
$pos++;
        }
    }

    for(
$I=count($kwicArray)-1;$I>=0;$I--) {
       
$kwic = '<span class="kwic">'.$kwicArray[$I]['kwic'].'</span>';
       
$str2 = substr_replace($str2,$kwic,$kwicArray[$I]['pos'],$kwicLen);
    }
       
    return(
$str2);
}
?>
up
-1
Psudo - thepsudo at gmail dot com
3 years ago
For highlighting without the overhead of regex and without destroying capitalization, try this:

<?php
function highlight($needle, $haystack){
   
$ind = stripos($haystack, $needle);
   
$len = strlen($needle);
    if(
$ind !== false){
        return
substr($haystack, 0, $ind) . "<b>" . substr($haystack, $ind, $len) . "</b>" .
           
highlight($needle, substr($haystack, $ind + $len));
    } else return
$haystack;
}
?>

This example uses HTML bold tags, but you can easily change the highlighting method.
up
-1
holblin at holblin dot com
3 years ago
Warning with highlighting ...

I used :

<?php
$text
= preg_replace('/('.$q.')/i','<span class=highlighting "">$1</span>' , $text);
?>

Because this line do not allow to highlight uppercase and lowercase correctly (transform uppercase to lowercase for exemple)

<?php
$text
= str_ireplace( $q , '<span class=highlighting "">'.$q.'</span>', $text);
?>

But when $q contain some regex you have some problems ... for exemple :
<?php $q = '('; ?>

So you must use preg_replace to highlight correctly the text and you must create a function for escape bad regex caracters !

I think that a better function can be found but this works I guess :

<?php
function regex_escape( $q )
{
    return
preg_replace('/([\[\]\(\)\{\}\-\.\*\?\|\^\$])/', '\$1', $q);
}
?>
up
-1
triplepoint at gmail dot com
4 years ago
Regarding maintaining the case of the find/replace for search-highlighting purposes:

if the performance hit of a regular expression isn't a big problem, there's something like:

<?php
function highlight_matches($find_text, $text) {
  return
preg_replace("/($find_text)/i", '<span class="search_item">$1</span>', $text);
}
?>
To Top