帮助preg_match_all,删除方括号

问题描述:

我想做一个功能,拿出方括号中的内容,但我不能删除我需要删除的大括号。帮助preg_match_all,删除方括号

这是它应该如何看:

Hello [there] blabla 

假作:

Hello <a href="http://blabla.com/index.php?id=there">linky</a> blabla 

我当前的代码:

$txt='Hello [there] blabla'; 

$re1='.*?'; # Non-greedy match on filler 
$re2='(\\[.*?\\])'; # Square Braces 1 

if ($c=preg_match_all ("/".$re1.$re2."/is", $txt, $matches)) 
{ 
    $sbraces1=$matches[1][0]; 
    print "<a href='http://blabla.com/index.php?id=$sbraces1'>Linky</a> \n"; 
} 

我当前的代码做到这一点:

Hello [there] blabla 

假作:

<a href='http://blabla.com/index.php?id=[there]'>Linky</a> 
+0

难道不更好地使用preg_replace这种方式,你不必重建你的字符串? – Brady 2010-11-08 15:44:48

更好地利用preg_replacepreg_replace_callback使用此模式:

\[(.*?)\] 

这里括号内的部分进行分组,而不是它的内容整个支架。

随着preg_replace_callback你再可以写一个函数,它接受了比赛,把它变成一个链接:

function callback_linkify($match) { 
    return '<a href="http://example.com/index.php?id='.urlencode($match[1]).'">Linky</a>'; 
} 

而且采用该模式,并在回调函数:

$output = preg_replace_callback('/\[(.*?)\]/', 'callback_linkify', $str); 

捕获的部分反向引用括号之间:

\[([^\]]*)\] 

,然后使用第一个反向引用,而不是在它的位置在全场比赛。

如果你想匹配的方括号,内内容,您可以尝试使用这样的:

"(\\[)([^\\]]*)(\\])"

我只希望我正确转义括号。

+0

除非您以后需要分别引用括号,否则不需要将它们放入单个组中。 – Joey 2010-11-08 15:47:45

+0

@Joey我同意。我只是不确定他是否宁愿在括号内进行替换,而不是在整个匹配的字符串上进行替换。 – zzzzBov 2010-11-08 15:57:01

这个怎么样?

编辑:

<?php 
$string = 'Hello [there] blabla'; 
$re2='(\\[)([^\\]]*)(\\])'; # Square Braces 1 
$pattern = "/".$re2."/is"; 
$replacement = '<a href="http://blabla.com/index.php?id=$2">linky</a>'; 
echo preg_replace($pattern, $replacement, $string); 
?> 
+0

http://codepad.org/9pWmEdtA正常工作:) – Shikiryu 2010-11-08 16:12:17

+0

请不要发布完全由其他网站链接组成的答案。包含指向pastebin网站的链接是可以的,但是如果没有它们,你的答案应该是合理的。如果代码太长而无法发布(而你的代码不是这样),请提取最重要的部分并添加一些说明文字。 – 2010-11-08 19:43:05

+0

@Alan Moore,我会在这里发布代码,但是每当我将代码放在pre和代码标签位代码disapears中。将代码放在像PastBin这样的服务中是我可以保证所有代码都被保留的唯一方法 – Brady 2010-11-09 10:14:52