我正在为论坛创建一些自定义BBcode。我正试图让正则表达式正确,但它已经让我两天不知所措了。欢迎任何专家建议。
输入(例如样本论坛帖子):
[quote = Bob]我喜欢Candace。她很好。[/ quote]
我同意,她很好。我也喜欢Ashley,特别是[Ryan]喝酒的时候。
基本上,我想在[user] [/ user] BBcode中包含任何名称(来自指定列表)...当然除了被引用的那些,因为这样做会导致一些可怕的解析错误。下面是我想要输出的示例。
所需的输出:
[quote = Bob]我喜欢[用户] Candace [/ user]。她很好。[/ quote]
我同意,她很好。我喜欢[用户] Ashley [/ user],特别是[[user] Ryan [/ user]],当他喝酒的时候。
我目前的代码:
$searchArray = array(
'/(?i)(Ashley|Bob|Candace|Ryan|Tim)/'
);
$replaceArray = array(
"[user]\\0[/user]"
);
$text = preg_replace($searchArray, $replaceArray, $input);
$ input当然设置为帖子内容(即上面列出的第一个例子)。我怎样才能达到我想要的效果?当名称前面带有等号(=)时,我不希望正则表达式匹配,但在正则表达式中的名称前放置一个[^ =]会使它匹配任何非等号符号(即空格) ),然后弄乱格式化。
更新
问题在于,通过使用\ 1而不是\ 0,它会省略名称前的第一个字符(因为除了=之外的任何东西都匹配)。输出结果如下:
[quote = Bob]我喜欢[用户] Candace [/ user]。她很好。[/ quote]
我同意,她很好。我也喜欢[用户] Ashley [/ user],尤其是[用户] Ryan [/ user]]。
答案 0 :(得分:4)
您使用[^=]
想法走在正确的轨道上。您可以将其放在捕获组之外,而不是完全匹配的\\0
,而是使用\\1
和\\2
,即第一个&第二个捕获组
$searchArray = array(
'/(?i)([^=])(Ashley|Bob|Candace|Ryan|Tim)/'
);
$replaceArray = array(
"\\1[user]\\2[/user]"
);
$text = preg_replace($searchArray, $replaceArray, $input);