2012-07-25 54 views
3
我使用一个简单的regex在PHP

解析自定义模板正则表达式,两个字符串之间的任何字符串与多次出现

$row = preg_replace_callback(
    '/\^([^\^]+)\^/', create_function ('$m', 'global $fields_ar; return $fields_ar{$m[1]};'), 
    $template 
    ); 

基本上两者之间一切^取代有相应的变量名值例如如果$模板是:

<td>^title_source^ by ^author_source^<br/> 

$fields_ar['title_source'] == 'my title' and $fields_ar['author_source'] == 'my author' 

$行变为:

<td>my title by my author<br/> 

万物工作正常,但我想改变分隔符;而不是^,它有可能被包含在其他两个^之间,我想使用一个字符串,例如“sel3ction”,但是:

$row = preg_replace_callback(
    '/sel3ction([^sel3ction]+)sel3ction/', create_function ('$m', 'global $fields_ar; return $fields_ar{$m[1]};'), 
    $template 
    ); 

不起作用;我很确定这个问题是消极的。

有什么建议吗?

我知道这不是一个“干净”的方法,因为即使是最奇怪的字符串可能会很棘手,但目前我想尝试使用这种方法。如果你有更加标准的解决方案,当然是值得欢迎的。

谢谢!

+1

[PHP 5支持匿名函数](http://us2.php.net/manual/en/functions.anonymous.php),所以这里不需要使用'create_function'。 – 2012-07-25 18:50:39

回答

1

你可以告诉你的表达不使用惰性限定符(?)匹配.的时候要贪婪:

/sel3ction(.+?)sel3ction/ 

这告诉正则表达式引擎不匹配.后会发生什么(在这种情况下, “sel3ction”)与其他任何可能匹配的内容。

+0

它的功能就像一个魅力;非常感谢你。 – user1552557 2012-07-25 18:53:30

相关问题