1

我有一个内容块,其中的人名用双括号括起来。例如:

Lorem ipsum dolor sit amet,consectetur [[Jane Doe]] adipisicing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua。Ut enim ad minim veniam, quis nostrud exercitation ullamco [[John Doe]] laboris nisi ut aliquip ex ea commodo consequat。Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur。Exceptioneur sint occaecat cupidatat non proident, [[Susan Van-Something]] sunt in culpa qui officia deserunt mollit anim id est laborum。

我正在尝试编写一个正则表达式,将名称从双括号中取出,并在内容中使用以下格式的链接替换它们:

<a href='http://www.example.com/jane-doe/'>Jane Doe</a>

在 URL 中,空格被转换为连字符,并且整个名称都是小写的。

到目前为止我有

// the filter function
function names_brackets( $content ) {
    // regex replace the names with links
    // return the content
    return preg_replace_callback( "/^([[[A-Za-z0-9- ]+?]])/" , "names_callback" , $content);
}

// callback function to allow post processing
function names_callback ( $matches ) {
    $find = array(' ', '[', ']');
    $replace = array('-', '', '');
    return '<a href="http://www.example.com/' . strtolower( str_replace($find, $replace, $matches[1]) ) . '">' . str_replace(']', '', str_replace('[', '', $matches[1])) . '</a>';
}

不幸的是,我怀疑正则表达式有问题。任何帮助,将不胜感激。

4

3 回答 3

1

您需要转义文字括号并删除字符串开头的锚点:

"/(\[\[[A-Za-z0-9 -]+\]\])/"
于 2012-12-12T17:22:00.703 回答
0

您的模式有点偏离 - 除其他外,您需要转义括号,如下所示:

/(\[\[[A-Za-z0-9\s]+\]\])/

...这将寻找 [[包括空格的一些文本]]

根据需要调整组。

于 2012-12-12T17:23:33.343 回答
0

您确实需要在模式中转义括号,但仍有改进的余地:如果您使用多个捕获组,您实际上不必在回调函数中进行另一次搜索和替换。像这儿:

function names_brackets( $content ) {
    return preg_replace_callback('/(\[\[)([\w -]+?)(]])/',
               'names_callback', $content);
}

function names_callback ( $matches ) {
    return '<a href="http://www.example.com/' 
           . strtolower(str_replace(' ', '-', $matches[2])) 
           . "\">$matches[2]</a>";
}

这样,左括号和右括号仍会从结果中删除,但回调函数甚至不必知道它们:它只使用第二组 - 具有名称的那一组。

于 2012-12-12T17:26:22.220 回答