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

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

报告相同问题?

悬赏问题

  • ¥15 如何使用canvas在图片上进行如下的标注,以下代码不起作用,如何修改
  • ¥15 Windows 系统cmd后提示“加载用户设置时遇到错误”
  • ¥50 vue router 动态路由问题
  • ¥15 关于#.net#的问题:End Function
  • ¥15 无法import pycausal
  • ¥15 VS2022创建MVC framework提示:预安装的程序包具有对缺少的注册表值的引用
  • ¥15 weditor无法连接模拟器Local server not started, start with?
  • ¥20 6-3 String类定义
  • ¥15 嵌入式--定时器使用
  • ¥20 51单片机学习中的问题