0

我很难弄清楚这一点:

我有一个字符串 ($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

4 回答 4

0

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

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

捕获组1得到Folder/,捕获组2得到File

于 2013-11-05T05:31:39.507 回答
0

你可以这样做:

$data = preg_replace('~\[pagelink](/?(?>[^[/]+/)*([^/[]+))\[/pagelink]~', '<a href="$1">$2</a>', $data);
于 2013-11-05T05:32:04.797 回答
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);

但是你的建议很棒而且很有帮助!谢谢!

于 2013-11-05T16:31:11.527 回答
0

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

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

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

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

于 2013-11-05T09:13:56.797 回答