帮助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>
更好地利用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);
捕获的部分反向引用括号之间:
\[([^\]]*)\]
,然后使用第一个反向引用,而不是在它的位置在全场比赛。
这个怎么样?
编辑:
<?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);
?>
http://codepad.org/9pWmEdtA正常工作:) – Shikiryu 2010-11-08 16:12:17
请不要发布完全由其他网站链接组成的答案。包含指向pastebin网站的链接是可以的,但是如果没有它们,你的答案应该是合理的。如果代码太长而无法发布(而你的代码不是这样),请提取最重要的部分并添加一些说明文字。 – 2010-11-08 19:43:05
@Alan Moore,我会在这里发布代码,但是每当我将代码放在pre和代码标签位代码disapears中。将代码放在像PastBin这样的服务中是我可以保证所有代码都被保留的唯一方法 – Brady 2010-11-09 10:14:52
难道不更好地使用preg_replace这种方式,你不必重建你的字符串? – Brady 2010-11-08 15:44:48