正则表达式处理和更改字符串中的多个链接


RegEx to process and change multiple links in a string

我很难弄清楚这一点:

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

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