0

我的 RegEx 有问题。我想翻译一个 BBCode 链接,例如

[link=www.stackoverflow.com]堆栈溢出[/link]

进入一个 HTML 链接,如

<a href='www.stackoverflow.com'>Stack-Overflow</a>.

在我的字符串中,可以在 BBCode 中创建多个链接。我还需要一个函数来将 html 翻译回 BBCode。

我的功能是 BBCode 到 HTML:

$Text = preg_replace('/\[link=([^ ]+).*\](.*)\[\/link\]/', '<a href="$1">$2</a>', $Text);  

HTML 到 BBCode:

$Text = preg_replace('/\<a href="([^ ]+).*\">(.*)\<\/a\>/Usi', '[link=$1]$2[/link]', $Text); 

我的问题是这些功能,当我有多个链接时,它不起作用,当我将一个链接翻译成 HTML 并且我想翻译回来时,我只有链接的第一个字符。

每个人都可以帮助我吗?提前致谢

4

2 回答 2

5

至于您的第一个问题,*它是贪婪的,因此它会捕获第一个和最后一个链接之间的所有内容。一个简单的解决方案是使用非贪婪限定符,或者不允许[]在您的组中:

\[link=([^ \[\]]+)\]([^\[\]]*)\[\/link\]

同样,反过来:

<a href="([^ "]+)">([^<]*?)\<\/a\>

这是非贪婪版本。它允许[]链接,甚至更短:

\[link=([^ ]*?)\](.*?)\[\/link\]
于 2009-12-27T11:54:46.917 回答
0

你的问题在于贪婪。*使用?使其不贪婪。

$Text = preg_replace(
    '/\[link=([^ ]+).*?\](.*?)\[\/link\]/',
    '<a href="$1">$2</a>',
    $Text
);
于 2009-12-27T11:57:17.787 回答