Php preg_replace()具有新顺序的多个反向引用

Php preg_replace()具有新顺序的多个反向引用,php,regex,preg-replace,Php,Regex,Preg Replace,我正试图用preg_replace()修改书名,以便按照图书馆处理书名的方式进行字母排序;将单词“the”、“a”和“an”从标题开头移动到标题末尾 例如,我正在使用书名“Final book title”,并希望将该书名修改为“Final book title,the”,以便实际标题为“Final book title”的书能够与示例中的书正确排序 preg_replace('/^(the |a |an )(.*?)/i', '$2, $1', 'The Final Book Title');

我正试图用preg_replace()修改书名,以便按照图书馆处理书名的方式进行字母排序;将单词“the”、“a”和“an”从标题开头移动到标题末尾

例如,我正在使用书名“Final book title”,并希望将该书名修改为“Final book title,the”,以便实际标题为“Final book title”的书能够与示例中的书正确排序

preg_replace('/^(the |a |an )(.*?)/i', '$2, $1', 'The Final Book Title');
上面的代码生成字符串:
,这是最终的书名

我显然误解了反向引用的使用,但不明白为什么


谢谢

删除
*?
中的
,您不希望它懒惰

添加到量词会使它变懒,这大致意味着它将匹配尽可能少的数量,而整个正则表达式仍返回匹配

你在结尾没有锚,所以当
*?
匹配尽可能少的数量时(因为懒惰),它匹配,嗯,什么都不匹配。您的整个正则表达式只与
匹配

这应该能奏效

preg_replace('/^(the|an?) (.*)/i', '$2, $1', 'The Final Book Title');

噢!谢谢你的帮助,这太完美了!您可以将第一个捕获组重写为
(|an?
),可能需要将空格移到括号外,否则结果末尾会有一个尾随空格。