У меня есть текст:
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.
В PHP я хотел бы обернуть слово «curabitur» тегом <mark> как <mark>$1</mark>, используя нечувствительный регистр.
Этот следующий код работает:
return preg_replace("/(" . $needle . ")/mi", "<mark>$1</mark>", $haystack );
Выход :
<mark>Curabitur</mark> nec bibendum erat. Sed a scelerisque arcu, facilisis bibendum mauris. Mauris sed sapien volutpat, volutpat risus in, bibendum odio. Vestibulum eget neque a lorem <mark>CURABITUR</mark> 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, <mark>curabitur</mark> 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.
НО, если у вас есть этот текст:
[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] вы должны использовать preg_quote() для экранирования символов [,]
Однако следующее работает НЕТ:
return preg_replace("/(" . preg_quote( $needle ) . ")/mi", "<mark>$1</mark>", $haystack );
потому что $1 был изменен preg_quote().
Как я могу решить это?






Только что протестировал его без 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 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.
Я просто экранировал скобки обратной косой чертой \[ (см. пример, это то, что в основном должно делать preg_quote().
Затем я попытался с:
$needle = preg_quote("[curabitur]");
echo preg_replace("/(" . $needle . ")/mi", "<mark>$1</mark>", $haystack );
КЭД. Работает как часы. Вашей проблемы не существует, код работает.
Да, это работает. проблема была во время предыдущего лечения. Мне жаль.
Что вы подразумеваете под
$1был измененpreg_quote()? Он изменен так, чтобы механизм регулярных выражений мог анализировать его как обычный текст. У вас нет проблем для решения.