我很难搞清楚这一点:
我有一个字符串($ 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);
但是我收到了一堆错误,所以我想我不能以这种方式使用反向引用。
你能帮帮我吗? 感谢答案 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);
但是你的建议很棒,非常有帮助! 谢谢!