Name
Name

Reputation: 139

Replace content between two tags with preg_replace (php)

I have a string like this:

(link)there is link1(/link), (link)there is link2(/link)

Now i want to set the links that it look like this:

<a href='there is link1'>there is link1</a>, <a href='there is link2'>there is link2</a>

I tried with preg_replace but the result is an error (Unknown modifier 'l')

preg_replace("/\(link\).*?\(/link\)/U", "<a href='$1'>$1</a>", $return);

Upvotes: 2

Views: 1332

Answers (1)

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 626691

You actually are not far from the correct result:

  1. Escape the / before link (else, it will be treated as a regex delimiter and ruin your regex completely)
  2. Use single quotes to declare the regex (or you'll have to use double backslashes for escaping regex metacharacters)
  3. Add a capture group around .*? (so that you could later refer to with $1)
  4. Do not use U as it will make .*? greedy

Here is my suggestion:

\(link\)(.*?)\(\/link\)

And PHP code:

$re = '/\(link\)(.*?)\(\/link\)/'; 
$str = "(link)there is link1(/link), (link)there is link2(/link)"; 
$subst = "<a href='$1'>$1</a>"; 
$result = preg_replace($re, $subst, $str);
echo $result;

To also urlencode() the href parameter, you can use the preg_replace_callback function and manipulate the $m[1] (capture group value) inside it:

$result = preg_replace_callback($re, function ($m) {
    return "<a href=" . urlencode($m[1]) . "'>" . $m[1] . "</a>";
  }, $str);

See another IDEONE demo

Upvotes: 4

Related Questions