2014-11-22 775 views
3

我想匹配字符串中的文本,而忽略它的字母大小寫。如果字母不一致,我的例子就會失敗。php:如何忽略preg_replace內的字母大小寫?

/* 
    $text: fOoBaR 
    $str: little brown Foobar 
    return: little brown <strong>Foobar</strong> 
*/ 
function bold($text, $str) { 
    // This fails to match if the letter cases are not the same 
    // Note: I do not want to change the returned $str letter case. 
    return preg_replace('/('.str_replace(array("/", "\\"), array("\/", "\\"), $text).')/', "<strong>$1</strong>", $str); 
} 

$phrase = [ 
    'little brown Foobar' => 'fOoBaR', 
    'slash/slash' => 'h/sl', 
    'spoon' => 'oO', 
    'capital' => 'CAPITAL', 
]; 

foreach($phrase as $str => $text) 
    echo bold($text, $str) . '<br>'; 
+1

符合正則表達式的字符串的整數部分添加修改'i'的正則表達式。 '')/''將會是'')/ i''。另外,使用regexp中的'$ text'代替'preg_quote'函數的結果更安全。所以..'preg_replace('/'。preg_quote($ text)。'/ i','$ 0',$ str);' – Cheery 2014-11-22 00:23:39

+0

輝煌,感謝的傢伙。你昨天也幫助我。 :D你怎麼不寫你的答案作爲答案壽? – ditto 2014-11-22 00:25:01

+0

我不喜歡寫太多的文字或者很多解釋。特別是當答案是單線時。 – Cheery 2014-11-22 00:26:49

回答

4

好,爲線

return preg_replace('/('.str_replace(array("/", "\\"), array("\/", "\\"), $text). 
        ')/', "<strong>$1</strong>", $str); 

首先,使用改性劑/i爲不區分大小寫的regexp幾個修改。

其次,轉義$text在正則表達式中使用,因爲它可能具有特定於正則表達式的符號(它也允許您刪除所有這些替代品)。

第三,在拍攝組沒有必要,使用由$0

return preg_replace('/'.preg_quote($text, '/').'/i','<strong>$0</strong>',$str); 
2

將不區分大小寫的修飾符i添加到正則表達式中。

function bold($text, $str) { 
    // This fails to match if the letter cases are not the same 
    // Note: I do not want to change the returned $str letter case. 
    return preg_replace('/('.str_replace(array("/", "\\"), array("\/", "\\"), $text).')/i', "<strong>$1</strong>", $str); 
} 
+0

對不起,等了一段時間,以爲你不會取消刪除它,並寫下所有3個修改。無論如何保持它。 – Cheery 2014-11-22 00:39:13