6
$pattern = "/\[(.*?)\]\((.*?)\)/i";
$replace = "<a href=\"$2\" rel=\"nofollow\">$1</a>";
$text = "blah blah [LINK1](http://example.com) blah [LINK2](http://sub.example.com/) blah blah ?";
echo preg_replace($pattern, $replace, $text);

上述方法有效,但如果在 [] 和 () 之间意外插入空格,则所有内容都会中断,并且两个链接会混合为一个:

$text = "blah blah [LINK1] (http://example.com) blah [LINK2](http://sub.example.com/) blah blah ?";

我有一种感觉是松散的明星打破了它,但不知道如何匹配重复链接。

4

2 回答 2

9

如果我理解正确,那么您真正需要做的就是匹配两者之间的任意数量的空格,例如:

/\[([^]]*)\] *\(([^)]*)\)/i

解释:

\[             # Matches the opening square bracket (escaped)
([^]]*)        # Captures any number of characters that aren't close square brackets
\]             # Match close square bracket (escaped)
 *             # Match any number of spaces
\(             # Match the opening bracket (escaped)
([^)]*)        # Captures any number of characters that aren't close brackets
\)             # Match the close bracket (escaped)

理由:

我可能应该证明我把你.*?改成[^]]*

第二个版本更有效,因为它不需要做大量的回溯.*?。此外,一旦遇到开口[.*? 版本将继续查找,直到找到匹配项,而不是如果它不是我们想要的标签则失败。例如,如果我们使用.*?反对匹配表达式:

Sad face :[ blah [LINK1](http://sub.example.com/) blah

它会匹配

[ blah [LINK1]

http://sub.example.com/

使用该[^]]*方法将意味着输入正确匹配。

于 2012-05-13T11:31:30.343 回答
0

试试这个:

$pattern = "/\[(.*?)\]\s?\((.*?)\)/i";

\s?\[(.*?)\]在和之间添加\((.*?)\)

于 2012-05-13T11:31:44.950 回答