1

我正在为论坛创建一些自定义 BBcode。我正在尝试正确使用正则表达式,但它已经困扰我好几个星期了。欢迎任何专家建议。

示例输入(一个非常基本的示例):

[quote=Bob]I like Candace. She is nice.[/quote]

Ashley Ryan Thomas

本质上,我想在 [user][/user] BBcode 中包含任何名称(来自指定列表)......当然,除了那些被引用的名称,因为这样做会导致一些可怕的解析错误。

所需的输出:

[quote=Bob]I like [user]Candace[/user]. She is nice.[/quote]

[user]Ashley[/user] [user]Ryan[/user] [user]Thomas[/user]

我当前的代码:

 $searchArray = array(
 '/(?i)([^=]|\b|\s|\/|\r|\n|\t|^)(Ashley|Bob|Candace|Ryan|Thomas)(\s|\r|\n|\t|,|\.(\b|\s|\.|$)|;|:|\'|"|-|!|\?|\)|\/|\[|$)/'
 );

 $replaceArray = array(
   "\\1[user]\\2[/user]\\3"
 );

 $text = preg_replace($searchArray, $replaceArray, $input);

它目前生产的产品:

 [quote=Bob]I like [user]Candace[/user]. She is nice.[/quote]

 [user]Ashley[/user] Ryan [user]Thomas[/user]

请注意,Ryan 没有被 [user] 标签封装。另请注意,许多额外的正则表达式匹配字符是在论坛上出现时根据需要添加的,因此删除它们只会使其在其他情况下无法匹配(即禁止)。当然,除非您发现正则表达式本身存在明显错误,在这种情况下请务必指出。

不过,真的,任何帮助将不胜感激!谢谢你。

4

2 回答 2

1

很简单,您(\s|\r|...)在搜索名称的两端匹配分隔符。可怜的Ashley并且Ryan在您的测试字符串中共享一个空格字符。但是正则表达式只能匹配一次 - 作为左边界或右边界。

这里的解决方案是使用断言。把左边的列表括起来,把右边(?<= )的列表括起来,(?= )这样它们就变成了:

 (?<=[^=]|\b|\s|\/|^)
 (?=\s|,|\.(\b|\s|\.|$)|;|:|\'|"|-|!|\?|\)|\/|\[|$)

顺便说一句,\s已经包含\r|\n|\t,所以你可以删除它。

于 2011-10-14T18:47:35.383 回答
0

由于您实际上并不需要匹配任一侧的空格(只需确保它们在那里,对吗?)尝试将您的搜索表达式替换为:

$searchArray = array(
  '/\b(Ashley|Bob|Candace|Ryan|Thomas)\b/i'
);

$replaceArray = array(
 '[user]$1[/user]'
);

$text = preg_replace($searchArray, $replaceArray, $input);
于 2011-10-14T18:52:27.913 回答