PHP preg_replace: Нечувствительность к регистру с чувствительностью к регистру
Я использую preg_replace в PHP для поиска и замены определенных слов в строке, например:
$subject = "Apple apple";
print preg_replace('/\bapple\b/i', 'pear', $subject);
Что дает результат "грушевая груша".
То, что я хотел бы сделать, - это совместить слово нечувствительным к регистру, но уважать его, когда оно заменяется, - давая результат "Грушевая груша".
Следующие работы, но, кажется, немного долго на меня наводнили:
$pattern = array('/Apple\b/', '/apple\b/');
$replacement = array('Pear', 'pear');
$subject = "Apple apple";
print preg_replace($pattern, $replacement, $subject);
Есть ли лучший способ сделать это?
Обновление. В дополнение к отличному запросу, поднятому ниже, для целей этой задачи я хочу только уважать "заголовок" - так ли первая буква слова является капиталом.
Ответы
Ответ 1
Я имею в виду эту реализацию для обычного случая:
$data = 'this is appLe and ApPle';
$search = 'apple';
$replace = 'pear';
$data = preg_replace_callback('/\b'.$search.'\b/i', function($matches) use ($replace)
{
$i=0;
return join('', array_map(function($char) use ($matches, &$i)
{
return ctype_lower($matches[0][$i++])?strtolower($char):strtoupper($char);
}, str_split($replace)));
}, $data);
//var_dump($data); //"this is peaR and PeAr"
- это сложнее, конечно, но подходит исходный запрос для любой позиции. Если вы ищете только первую букву, это может быть излишним (см. @Jon ответ)
Ответ 2
Вы можете сделать это с помощью preg_replace_callback
, но это еще более длинное завивание:
$replacer = function($matches) {
return ctype_lower($matches[0][0]) ? 'pear' : 'Pear';
};
print preg_replace_callback('/\bapple\b/i', $replacer, $subject);
Этот код просто рассматривает капитализацию первого символа матча, чтобы определить, что заменить; вы можете адаптировать код, чтобы сделать что-то более активное.
Ответ 3
Это решение, которое я использовал:
$result = preg_replace("/\b(foo)\b/i", "<strong>$1</strong>", $original);
В лучших словах, которые я могу, я попытаюсь объяснить, почему это работает: обернуть свой поисковый запрос с помощью ()
означает, что я хочу получить доступ к этому значению позже. Поскольку это первый элемент в pars в RegEx, он доступен с помощью $1
, как вы можете видеть в параметре подстановки