2015-09-22 65 views
2

我有一个这样的字符串:替换了preg_replace(PHP)两个标记之间的内容

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

现在我想设置,它看起来像这样的链接:

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

我用preg_replace尝试过,但结果是错误(Unknown modifier 'l'

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

+0

你需要躲避斜杠(ES) –

+0

但我逃过了斜线以 “\” 或? – Name

+1

什么是标题! –

回答

4

你实际上是从正确的结果并不很远。

  1. 逃离/以前link
  2. 使用单引号(否则,将被视为正则表达式的分隔符,完全毁掉你的正则表达式)来申报正则表达式(或者你将不得不使用双反斜线正则表达式元字符)
  3. 添加捕获组围绕.*?(这样你可以稍后查阅与$1
  4. 不要使用U,因为它会使.*?贪婪

这里是my suggestion

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

而且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; 

要还urlencode()href参数,你可以使用preg_replace_callback函数并操作$m[1](捕获组值) T:

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

another IDEONE demo

+0

是否可以在'href'参数中urlencode()$ 1? – Name

+0

[赞](http://ideone.com/F5FDgr)? –

+0

是的,它的工作,我理解它谢谢你! – Name