2017-06-11 84 views
2

我已表达[text][id]应与链路<a href='id'>text</a>PHP preg_replace函数修饰

的解决方案是替代(id是整数)

$s = preg_replace("/\[([^\]]+)(\]*)\]\[([0-9]+)\]/","<a href='$3'>$1$2</a>",$string); 

然而,在某些情况下(不总是!)的表达可能如下

[text][id][type] 

在这种情况下应该用<a href='id' class='type'>text</a>

想法?

+0

你的例子中没有数字是什么?\ [([0-9] +)\]'在做什么?或'id'是一个整数? – chris85

+0

是的,ID是整数 –

+0

什么是'text'和'type'?我认为你需要2个正则表达式,因为替换每次都需要'class =“$ 3”',否则我想你可以在另一个步骤中剥离它,如果是空的话。 – chris85

回答

5

使用preg_replace_callback功能的解决方案:

$str = 'some text [hello][1] some text [there][2][news]'; // exemplary string 

$result = preg_replace_callback('/\[([^][]+)\]\[([^][]+)\](?:\[([^][]+)\])?/',function($m){ 
    $cls = (isset($m[3]))? " class='{$m[3]}'" : ""; // considering `class` attribute 
    return "<a href='{$m[2]}'$cls>{$m[1]}</a>"; 
},$str); 

print_r($result); 

输出(如网页源代码):

some text <a href='1'>hello</a> some text <a href='2' class='news'>there</a> 

  • (?:\[([^][]+)\])? - 考虑可选的第三捕获基团(属性值)