PHP preg_replace专业知识求购

时间:2011-05-02 22:53:44

标签: php regex arrays preg-replace

我正在为论坛创建一些自定义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]]。

1 个答案:

答案 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);