RegEx处理和更改字符串中的多个链接

时间:2013-11-05 05:19:40

标签: php regex

我很难搞清楚这一点:

我有一个字符串($ data),其中包含一些以这种方式格式化的链接:

[pagelink]Folder/File[/pagelink]

$ data包含多个这些链接。

我需要用实际的html链接替换这些链接,我有这个代码来做(有效):

$data = preg_replace('/\[pagelink\](.*?)\[\/pagelink\]/is','<a href="$1">$1</a>',$data);

现在我想从显示给用户的链接部分删除所有“文件夹”实例,而不实际更改链接本身;换句话说,如果链接是这样的:

[pagelink]Folder/File[/pagelink]

我希望它成为:

<a href="Folder/File">File</a>

我试过的是:

$data = preg_replace('/\[pagelink\](.*?)\[\/pagelink\]/is','<a href="$1">'.( strstr($1) === false ? $1 : str_replace('/','',strstr($1)) ).'</a>',$data);

但是我收到了一堆错误,所以我想我不能以这种方式使用反向引用。

你能帮帮我吗? 感谢

4 个答案:

答案 0 :(得分:0)

修改正则表达式,使文件夹和文件位于不同的捕获组中。

$data = preg_replace('#\[pagelink\](.*?/)?([^/]*?)\[/pagelink\]#is','<a href="$1$2">$2</a>',$data);

抓取小组1获取Folder/,抓取小组2获取File

答案 1 :(得分:0)

你可以这样做:

$data = preg_replace('~\[pagelink](/?(?>[^[/]+/)*([^/[]+))\[/pagelink]~', '<a href="$1">$2</a>', $data);

答案 2 :(得分:0)

看起来像BBCode。 PHP有一个扩展。

http://www.php.net/manual/en/function.bbcode-create.php

其中一条评论链接到该库的PHP实现。

如果需要逻辑来编译preg_replace()的替换,请使用preg_replace_callback()。

答案 3 :(得分:0)

感谢您的回答! 实际上我也找到了另一个解决方案。

preg_replace_callback也适用于此,我想出了这个也有效:

$data = preg_replace_callback('/\[pagelink\](.*?)\[\/pagelink\]/is',function ($matches) { return '<a href="'.$_SERVER['PHP_SELF'].'?p='.$matches[1].'">'.( strstr($matches[1],'/') === false ? $matches[1] : str_replace('_',' ',str_replace('/','',strstr($matches[1],'/'))) ).'</a>'; },$data);

但是你的建议很棒,非常有帮助! 谢谢!