我正在尝试创建一个用方括号取出内容的函数,但我无法删除需要删除的大括号。
这应该是它的样子:
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 :(得分: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)
如果您想匹配方括号和内部内容,可以尝试使用以下内容:
"(\\[)([^\\]]*)(\\])"
我只是希望我正确地逃过了括号。