不区分大小写的preg_replace_callback

时间:2010-10-29 16:43:14

标签: php preg-replace-callback

在下面的函数中,我想匹配不区分大小写的关键字(应该匹配“Blue Yoga Mats”和“蓝色瑜伽垫”)...

但是,它目前仅在关键字是相同的情况下才匹配。

$ mykeyword =“蓝色瑜伽垫”;

$post->post_content = preg_replace_callback("/\b($mykeyword)\b/","doReplace", $post->post_content);

// the callback function
function doReplace($matches)
{
    static $count = 0;

    // switch on $count and later increment $count.
    switch($count++) {
        case 0: return '<b>'.$matches[1].'</b>';   // 1st instance, wrap in bold
        case 1: return '<em>'.$matches[1].'</em>'; // 2nd instance, wrap in italics
        case 2: return '<u>'.$matches[1].'</u>'; // 3rd instance, wrap in underline
        default: return $matches[1];              // don't change others.
            }
    }

5 个答案:

答案 0 :(得分:3)

只需将i修饰符添加到正则表达式即可使其执行不区分大小写的匹配:

"/\b($mykeyword)\b/i"

顺便说一句,如果您还没有,则需要从关键字中转义特殊的正则表达式字符。如果存在任何问题,他们可能搞砸你的正则表达式并导致PHP警告/错误。在执行替换之前调用preg_quote()

$mykeyword_escaped = preg_quote($mykeyword, '/');
$post->post_content = preg_replace_callback("/\b($mykeyword_escaped)\b/i","doReplace", $post->post_content);

答案 1 :(得分:0)

将“i”修饰符添加到正则表达式:

/\b($mykeyword)\b/i

答案 2 :(得分:0)

$post->post_content = preg_replace_callback("/\b($mykeyword)\b/i","doReplace", $post->post_content);

使用TOKENregexpTOKENi执行不区分大小写的搜索。

有关修饰符的详细信息,请参阅PHP手册中的Pattern Modifiers

答案 3 :(得分:0)

使用/ i修饰符:

$post->post_content = preg_replace_callback("/\b($mykeyword)\b/i","doReplace", $post->post_content);

答案 4 :(得分:0)

您也可以使用T-Regx library

<?php
pattern('\b($mykeyword)\b')->replace($post->post_content)->callback('doReplace');
      // ↑ Delimiters are not required 

此外,使用$mykeyword可能会导致用户输入的字符破坏您的模式。使用T-Regx,您可以使用Prepared Patterns,只需构建您的模式:

<?php
$pattern = Pattern::inject("\b(@keyword)\b", [
    'keyword' => $mykeyword  
    // quoting unsafe characters
]);
$pattern->replace($post->post_content)->callback('doReplace');