帮助preg_match_all,删除方括号

时间:2010-11-08 15:39:41

标签: php regex

我正在尝试创建一个用方括号取出内容的函数,但我无法删除需要删除的大括号。

这应该是它的样子:

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> 

4 个答案:

答案 0 :(得分:1)

这个怎么样?

编辑:

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

答案 1 :(得分:1)

使用此模式更好地使用preg_replace preg_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);

答案 2 :(得分:0)

在反向引用中的之间捕获部分

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

然后使用第一个反向引用代替整个匹配。

答案 3 :(得分:0)

如果您想匹配方括号和内部内容,可以尝试使用以下内容:

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

我只是希望我正确地逃过了括号。