dpxyfa4718 2015-09-22 20:25
浏览 360
已采纳

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

  • 写回答

1条回答 默认 最新

  • dounong5373 2015-09-22 20:36
    关注

    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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?