PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Sunday, November 20, 2022

[FIXED] How to process a string with preg_replace and preg_quote (case insensitive)?

 November 20, 2022     php, preg-replace, regex     No comments   

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)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing