【问题标题】:preg_replace to turn underscore to space except when underscore is part of a given patternpreg_replace 将下划线变为空格,除非下划线是给定模式的一部分
【发布时间】:2013-04-17 10:15:40
【问题描述】:

我正在尝试获取一个字符串,例如:

$search = "Bob Loblaw + Mark Hamill RT45_part12 foo_092344"

并删除所有非字母数字字符,除非下划线位于 RT45_part12 中。

我想要的结果应该是:

“Bob Loblaw Mark Hamill RT45_part12 foo 092344”

preg_replace("/[^A-Za-z0-9_]/", ' ', $search)

查找 RT45_part12 的正则表达式是

\b[a-zA-Z]{2,4}[0-9]{1,5}_part[0-9]{1,5}\b

我不知道如何将这两者结合起来,以便跳过 RT45_part12 中的下划线,而是替换 derrick 之后的下划线。我需要使用前瞻、后瞻功能吗?

【问题讨论】:

    标签: php regex preg-replace preg-match


    【解决方案1】:

    限制够了吗?

    echo preg_replace ( "~[^\w ]++|_(?!part\d{1,5}\b)~i", " ", $mystring);
    

    但是,如果您想确定,请使用:

    echo preg_replace ( "~[^\w ]++|(\b[a-z]{2,4}\d{1,5}_part\d{1,5}\b)|_~i", "$1 ", $mystring);
    

    【讨论】:

    • ++ 在这个正则表达式中做了什么?
    • 它通知正则表达式引擎这部分模式不需要回溯
    • 这很棒!谢谢你。我不能投票,因为我的代表很低:/我是正则表达式的新手,并且喜欢它的强大功能。感谢您的帮助。
    • denizb - 你应该能够“接受”答案,因为这是你的问题,如果它解决了你的问题,那么在这里做的事情是正确的 - 这样其他有类似的问题会知道这对你有用。
    【解决方案2】:

    希望有帮助

    $search = "Bob Loblaw + Mark Hamill RT45_part12 foo_092_34_4";
    
    echo preg_replace("/[^a-zA-Z0-9 ]|(RT45_part12)/", '$1', $search);
    
    //Bob Loblaw  Mark Hamill RT45_part12 foo092344
    

    echo preg_replace("/[^a-zA-Z0-9 ]|([a-zA-Z]{2,4}[0-9]{1,5}_part[0-9]{1,5})/", '$1', $search);
    

    更新(非字母数字字符为空格)(仅适用于 RT45_part12 之后有空格)

    echo preg_replace("/[^a-zA-Z0-9 ]|([a-zA-Z]{2,4}[0-9]{1,5}_part[0-9]{1,5}) /", '$1 ', $search);
    

    【讨论】:

    • 这几乎是正确的,我正在尝试看看它是如何工作的。但我需要它用空格替换下划线,除非它的形式是 RT45_part12。所以在这种情况下,一切都是正确的,除了 foo92344 应该在 foo 和 092344 之间有一个空格(同时在 RT45_part12 中保留下划线)
    • foo_92344 变成 foo 92344 ,, 如果 Bob_Loblaw 那么 ??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多