Issue
I have a text:
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.
In PHP I would like to wrap the word "curabitur" with the tag <mark>
like <mark>$1</mark>
using insensitive casing.
This following code works :
return preg_replace("/(" . $needle . ")/mi", "<mark>$1</mark>", $haystack );
Output :
<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.
BUT if you have this text :
[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.
and $needle = [curabitur]
you should use preg_quote()
to escape characters [
,]
However the following does NOT work:
return preg_replace("/(" . preg_quote( $needle ) . ")/mi", "<mark>$1</mark>", $haystack );
because $1
was modified by preg_quote()
.
How can I resolve this ?
Solution
Just tested it without preg_quote but using your desired needle and it works like a charm:
$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 );
The result is:
<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.
I simply escaped the brackets with a backslash \[
(see the example, this is what basically preg_quote()
should do.
Then I tried with:
$needle = preg_quote("[curabitur]");
echo preg_replace("/(" . $needle . ")/mi", "<mark>$1</mark>", $haystack );
QED. It works like a charm. Your problem does not exist, the code works.
Answered By - Blackbam Answer Checked By - David Goodson (PHPFixing Volunteer)
0 Comments:
Post a Comment
Note: Only a member of this blog may post a comment.