我有一个含有双括号内人名的内容块。例如:
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 在voluptderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur。 Excepteur sint occaecat cupidatat non proident,[[Susan Van-Something]]在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>';
}
不幸的是我怀疑正则表达式有问题。任何帮助,将不胜感激。
答案 0 :(得分:1)
您需要转义文字括号并删除字符串开始锚点:
"/(\[\[[A-Za-z0-9 -]+\]\])/"
答案 1 :(得分:0)
你的模式有点偏离 - 除其他外,你需要逃避括号,如下:
/(\[\[[A-Za-z0-9\s]+\]\])/
...将寻找[[包括空白的一些文字]]
根据需要调整组。
答案 2 :(得分: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>";
}
这样,开始和结束括号仍然会从结果中删除,但回调函数甚至不需要知道它们:它只使用第二组 - 具有名称的组。