寻求PHP preg_替换专业知识

寻求PHP preg_替换专业知识,php,regex,arrays,preg-replace,Php,Regex,Arrays,Preg Replace,我正在为论坛创建一些自定义BBcode。我正在努力使正则表达式正确,但这两天我一直在逃避它。欢迎任何专家建议 输入(例如,示例论坛帖子): 我喜欢坎迪斯。她很好 我同意,她很好。我也喜欢艾希礼,尤其是[瑞安]喝酒的时候 本质上,我想将任何名称(来自指定列表)封装在[user][/user]BBcode中。。。当然,除了那些被引用的,因为这样做会导致一些可怕的解析错误。下面是我希望输出的示例 所需输出: 我喜欢[user]Candace[/user]。她很好 我同意,她很好。我也喜欢[user]A

我正在为论坛创建一些自定义BBcode。我正在努力使正则表达式正确,但这两天我一直在逃避它。欢迎任何专家建议

输入(例如,示例论坛帖子):

我喜欢坎迪斯。她很好

我同意,她很好。我也喜欢艾希礼,尤其是[瑞安]喝酒的时候

本质上,我想将任何名称(来自指定列表)封装在[user][/user]BBcode中。。。当然,除了那些被引用的,因为这样做会导致一些可怕的解析错误。下面是我希望输出的示例

所需输出:

我喜欢[user]Candace[/user]。她很好

我同意,她很好。我也喜欢[user]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当然设置为post内容(即上面列出的第一个示例)。我怎样才能达到我想要的结果?我不希望正则表达式在名称前面加等号(=)时匹配,但在正则表达式中的名称前面加上[^=]将使其匹配任何非等号字符(即空格),这会弄乱格式

更新

问题是,如果使用\1而不是\0,则会忽略名称前的第一个字符(因为除了=之外的任何字符都是匹配的)。输出结果如下:

我喜欢[user]Candace[/user]。她很好

我同意,她很好。我也喜欢[user]Ashley[/user],尤其是[user]Ryan[/user]喝酒的时候


你的想法是正确的。您可以将其置于捕获组之外,使用
\\1
\\2
即第一个和第二个捕获组,而不是完全匹配的
\\0

$searchArray = array(
  '/(?i)([^=])(Ashley|Bob|Candace|Ryan|Tim)/'
);

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

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

你的想法是正确的。您可以将其置于捕获组之外,使用
\\1
\\2
即第一个和第二个捕获组,而不是完全匹配的
\\0

$searchArray = array(
  '/(?i)([^=])(Ashley|Bob|Candace|Ryan|Tim)/'
);

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

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

如果我可以用PHP函数substr之类的东西修改\\0 backreference,这将是一个相当简单的修复方法,但是如果我将变量设置为\\0,然后在replaceArray()中替换该变量,则回调不会受到影响。我的正则表达式很烂(你在寻找单词边界吗?如果我可以用PHP函数substr之类的东西修改\\0 backreference,这将是一个相当简单的修复方法,但是如果我将变量设置为\\0,然后在replaceArray()中替换该变量,则回调不会受到影响。我讨厌正则表达式。:(你在寻找单词边界吗?