【问题标题】:preg_replace() with multiple backreferences in new orderpreg_replace() 以新顺序具有多个反向引用
【发布时间】:2014-05-13 23:23:11
【问题描述】:

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

在我的示例中,我正在使用书名“最终书名”,并希望将该书名修改为“最终书名,The”,以便对实际标题为“最终书名”的书进行正确排序在我的例子中的书。

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

上面的代码生成字符串:, The Final Book Title

我显然误解了反向引用的使用,但不知道为什么。

谢谢!

【问题讨论】:

    标签: php regex preg-replace


    【解决方案1】:

    删除.*?中的?,你不想让它变得懒惰。

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

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

    这应该可以解决问题

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

    【讨论】:

    • 哎呀!感谢您的帮助,这是完美的!
    • 您可以将第一个捕获组重写为(the |an? )
    • 可能要移动括号外的空格,否则结果末尾会有一个尾随空格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2013-09-30
    • 1970-01-01
    • 2013-08-04
    相关资源
    最近更新 更多