Регистронезависимый preg_replace_callback - PullRequest
0 голосов
/ 29 октября 2010

В приведенной ниже функции я хочу сопоставить ключевое слово без учета регистра (должно совпадать с "Blue Yoga Mats" и "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 ]

3 голосов
/ 29 октября 2010

Просто добавьте модификатор 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);
0 голосов
/ 13 мая 2019

Вы также можете использовать Библиотека T-Regx :

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

Кроме того, использование $mykeyword может привести к тому, что введенные пользователем символы нарушат ваш шаблон.С T-Regx вы можете использовать Подготовленные шаблоны и просто строить ваш шаблон:

<?php
$pattern = Pattern::inject("\b(@keyword)\b", [
    'keyword' => $mykeyword  
    // quoting unsafe characters
]);
$pattern->replace($post->post_content)->callback('doReplace');
0 голосов
/ 29 октября 2010

Используйте модификатор / i:

$post->post_content = preg_replace_callback("/\b($mykeyword)\b/i","doReplace", $post->post_content);
0 голосов
/ 29 октября 2010
$post->post_content = preg_replace_callback("/\b($mykeyword)\b/i","doReplace", $post->post_content);

Используйте TOKENregexpTOKENi для выполнения поиска без учета регистра.

См. Модификаторы шаблонов в руководстве PHP для получения полной информации о модификаторах.

0 голосов
/ 29 октября 2010

Добавьте модификатор "i" к своему регулярному выражению:

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