正常表达需要帮助

时间:2012-12-12 17:17:08

标签: regex wordpress preg-replace preg-replace-callback

我有一个含有双括号内人名的内容块。例如:

  

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>';
}

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

3 个答案:

答案 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>";
}

这样,开始和结束括号仍然会从结果中删除,但回调函数甚至不需要知道它们:它只使用第二组 - 具有名称的组。