我很难弄清楚这一点:
我有一个字符串($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);
但是我收到一堆错误,所以我想我不能以这种方式使用反向引用。
你们能帮帮我吗?谢谢
修改正则表达式,使文件夹和文件位于单独的捕获组中。
$data = preg_replace('#'[pagelink'](.*?/)?([^/]*?)'[/pagelink']#is','<a href="$1$2">$2</a>',$data);
捕获组1
Folder/
,捕获组2
File
。
你可以这样做:
$data = preg_replace('~'[pagelink](/?(?>[^[/]+/)*([^/[]+))'[/pagelink]~', '<a href="$1">$2</a>', $data);
这看起来像BBCode。PHP有一个扩展。
http://www.php.net/manual/en/function.bbcode-create.php
其中一个注释链接到该库的 PHP 实现。
如果您需要逻辑来编译 preg_replace() 的替换,请使用 preg_replace_callback()。
谢谢你们的回答!实际上我也找到了另一种解决方案。
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);
但是您的建议很棒,非常有帮助!谢谢!