Как обработать строку с помощью preg_replace и preg_quote (без учета регистра)? - PullRequest
0 голосов
/ 06 июня 2019

У меня есть текст:

Curabitur nec bibendum erat.Sed Scelerisque Arcu, Facilisis Bibendum Mauris.Mauris sed sapien volutpat, volutpat risus in, bibendum odio.Вестибюль ЭГЕТ НЕКЕ Лорем КУРАБИТУР хрип.Aenean mollis ipsum ut facilisis egestas.Pellentesque finibus sed ante eget interdum.Nunc fringilla ante a egestas mattis.Sed tincidunt libero a dapibus bibendum.Morbi ac sapien Vehicleula, condimentum justo eget, curabitur nisl.Cras rutrum molestie diam, ac maximus mauris auctor quis.Ut vel diam nunc.Aliquam auctor, magna ac finibus fermentum, orci libero contectetur magna, id scelerisque tellus sem et orci.

В PHP я бы хотел обернуть слово «curabitur» тегом <mark> как <mark>$1</mark> с использованием нечувствительного корпуса.

Этот следующий код работает:

return preg_replace("/(" . $needle . ")/mi", "<mark>$1</mark>", $haystack );

Выход:

Curabitur necБибендум Эрат.Sed Scelerisque Arcu, Facilisis Bibendum Mauris.Mauris sed sapien volutpat, volutpat risus in, bibendum odio.Vestibulum eget neque lorem CURABITUR rhoncus.Aenean mollis ipsum ut facilisis egestas.Pellentesque finibus sed ante eget interdum.Nunc fringilla ante a egestas mattis.Sed tincidunt libero a dapibus bibendum.Morbi ac sapien vehicleula, condimentum justo eget, курабитур нисл.Cras rutrum molestie diam, ac maximus mauris auctor quis.Ut vel diam nunc.Aliquam auctor, magna ac finibus fermentum, orci libero contectetur magna, id scelerisque tellus sem et orci.

НО, если у вас есть этот текст:

[Curabitur] nec bibendumи требовалось.Sed Scelerisque Arcu, Facilisis Bibendum Mauris.Mauris sed sapien volutpat, volutpat risus in, bibendum odio.Вестибюль ЭГЕ НЕТЕ ЛОРЕМ [КУРАБИТУР] РОНКУСAenean mollis ipsum ut facilisis egestas.Pellentesque finibus sed ante eget interdum.Nunc fringilla ante a egestas mattis.Sed tincidunt libero a dapibus bibendum.Morbi ac sapien vehicleula, condimentum justo eget, [curabitur] nisl.Cras rutrum molestie diam, ac maximus mauris auctor quis.Ut vel diam nunc.Aliquam auctor, magna ac finibus fermentum, orci libero contectetur magna, id scelerisque tellus sem et orci.

и $needle = [curabitur] вам следует использовать preg_quote() для экранирования символов [, ]

Однако следующее НЕ работает:

return preg_replace("/(" . preg_quote( $needle ) . ")/mi", "<mark>$1</mark>", $haystack );

, поскольку $1 было изменено на preg_quote().

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 06 июня 2019

Только что протестировал его без preg_quote, но с помощью нужной вам иглы, и он работает как брелок:

$haystack = "[Curabitur] nec bibendum erat. Sed a scelerisque arcu, facilisis bibendum mauris. Mauris sed sapien volutpat, volutpat risus in, bibendum odio. Vestibulum eget neque a lorem CURABITUR rhoncus. Aenean mollis ipsum ut facilisis egestas. Pellentesque finibus sed ante eget interdum. Nunc fringilla ante a egestas mattis. Sed tincidunt libero a dapibus bibendum. Morbi ac sapien vehicula, condimentum justo eget, curabitur nisl. Cras rutrum molestie diam, ac maximus mauris auctor quis. Ut vel diam nunc. Aliquam auctor, magna ac finibus fermentum, orci libero consectetur magna, id scelerisque tellus sem et orci.";
$needle = "curabitur";

echo preg_replace("/(\[" . $needle . "\])/mi", "<mark>$1</mark>", $haystack );

Результат:

<mark>[Curabitur]</mark> nec bibendum erat.Sed Scelerisque Arcu, Facilisis Bibendum Mauris.Mauris sed sapien volutpat, volutpat risus in, bibendum odio.Вестибюль ЭГЕТ НЕКЕ Лорем КУРАБИТУР хрип.Aenean mollis ipsum ut facilisis egestas.Pellentesque finibus sed ante eget interdum.Nunc fringilla ante a egestas mattis.Sed tincidunt libero a dapibus bibendum.Morbi ac sapien Vehicleula, condimentum justo eget, curabitur nisl.Cras rutrum molestie diam, ac maximus mauris auctor quis.Ut vel diam nunc.Aliquam auctor, magna ac finibus fermentum, orci libero contectetur magna, id scelerisque tellus sem et orci.

Я просто избежал скобок с обратной косой чертой \[ (см. Пример, это то, что в основном preg_quote() должен сделать.

Тогда я попытался с:

$needle = preg_quote("[curabitur]");
echo preg_replace("/(" . $needle . ")/mi", "<mark>$1</mark>", $haystack );

КЭД. Это работает как шарм. Ваша проблема не существует, код работает.

...