使用 Regex 查找未被 BBcode 包围的字符串

发布于 2024-12-04 07:18:45 字数 402 浏览 0 评论 0原文

我需要一个正则表达式来查找和替换字符串中的单词/短语(仅当它不在 [url] BBcode 中时)。

$string = "Word [url='http://domain.com']Word test[/url]";

正则表达式不应该对“Word test”执行任何操作,而只能对“Word”的第一次出现执行任何操作。

编辑:更具体地说,这是一个论坛软件的插件,用于监视提及艺术家的消息。如果发生这种情况,艺术家的姓名将被替换为有关该艺术家的线程的 URL,除非它还不是 URL 的一部分(无论是在链接本身还是在描述中)。经过再三考虑,如果在任何非纯标记(b、i、u、颜色、列表等)的标签中使用它,则不应触发它。因此,如果有一个简单的方法来定义哪些标签可以被替换,那就太棒了!

提前致谢!

I am in need of a regular expression that will find, and replace, a word/phrase in a string only if it's not in an [url] BBcode.

$string = "Word [url='http://domain.com']Word test[/url]";

The regex should not do anything with "Word test", only the first occurrence of "Word".

EDIT: To be more specific, this is an addon for a forum software that monitors the messages for mentions of artists. If one occur, the artist's name is replaced with an URL to a thread about that artist, unless it's not already part of an URL (either in the link itself or the desc). After a second thought, it shouldn't be triggered if it's used in any tags that isn't pure markup (b,i,u,color,lists, etc). So an easy way to define what tags can be in to be replaced would be brilliant!

Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

温柔少女心 2024-12-11 07:18:45
$inputStr = "Coldplay [URL='localhost/threads/coldplay-paradise.32/']Coldplay - \"Paradise\"[/URL] Coldplay";

function replace( $matches ) {
    if( isset( $matches[2] ) && $matches[2] )
        return "[url='coldplay']".$matches[2]."[/url]";
    return $matches[0];
}

$regex = '/(\[.*?\].*?\[\/.*?\])?(Coldplay)?(.+?)?/si';
$outputStr = preg_replace_callback( $regex, 'replace', $inputStr );
echo $outputStr;

结果:

[url='coldplay']Coldplay[/url][URL='localhost/threads/coldplay-paradise.32/']Coldplay - "Paradise"[/URL] [url='coldplay']Coldplay[/url]
$inputStr = "Coldplay [URL='localhost/threads/coldplay-paradise.32/']Coldplay - \"Paradise\"[/URL] Coldplay";

function replace( $matches ) {
    if( isset( $matches[2] ) && $matches[2] )
        return "[url='coldplay']".$matches[2]."[/url]";
    return $matches[0];
}

$regex = '/(\[.*?\].*?\[\/.*?\])?(Coldplay)?(.+?)?/si';
$outputStr = preg_replace_callback( $regex, 'replace', $inputStr );
echo $outputStr;

result:

[url='coldplay']Coldplay[/url][URL='localhost/threads/coldplay-paradise.32/']Coldplay - "Paradise"[/URL] [url='coldplay']Coldplay[/url]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文