2

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);

2
  • you need to escape the slash(es) Commented Sep 22, 2015 at 20:26
  • but i escaped the slashes with an "\" or? Commented Sep 22, 2015 at 20:27

1 Answer 1

4

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

Sign up to request clarification or add additional context in comments.

1 Comment

Is it possible to urlencode() the $1 in the href parameter?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.