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 用lstm来预测股票价格
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上