代码之家  ›  专栏  ›  技术社区  ›  Free Consulting

如何使用preg_replace附加或替换尾随问号?

  •  2
  • Free Consulting  · 技术社区  · 14 年前

    我想在字符串的和处强制执行单个问号。在javascript中,它工作得很好:

    var re = /[?7!1]*$/;
    document.write('lolwut'.replace(re, '?'));
    document.write('lolwut?'.replace(re, '?'));
    document.write('lolwut??'.replace(re, '?'));
    document.write('lolwut???'.replace(re, '?'));
    document.write('lolwut???!!!11'.replace(re, '?'));
    

    所有返回值都等于“lolwut”? php变种不能那么顺利地工作:

    $re = '/[?7!1]*$/';
    echo preg_replace($re, '?', 'lolwut') . "\n";
    echo preg_replace($re, '?', 'lolwut?') . "\n";
    echo preg_replace($re, '?', 'lolwut??') . "\n";
    echo preg_replace($re, '?', 'lolwut???') . "\n";
    echo preg_replace($re, '?', 'lolwut???!!!11') . "\n";
    

    输出为:

    lolwut?
    lolwut??
    lolwut??
    lolwut??
    lolwut??
    

    我在这里做错什么了?


    更新:

    $(美元)断言字符串结尾
    断言是对当前匹配点后面或前面的字符的测试 不实际使用任何字符 .

    我的困惑,加上暗示的全球普雷格取代标志,是因为 萨拉 提供线索。(你们真的应该投票决定他的答案)

    3 回复  |  直到 14 年前
        1
  •  4
  •   salathe    14 年前

    只是为了回答被问到的问题(“我在这里做错了什么?”)你对什么感到困惑 精确地 正则表达式匹配。当字符串出现时,除了第一个字符串,regex实际上匹配 两次 这就是为什么你会得到两个问号(两个匹配,两个替换)。这种行为的根源是量词的混合。( * 不允许任何匹配)和结束锚定( $ 匹配字符串的结尾)。

    为了 lolwut???!!!11 :

    • 正则表达式第一次匹配 ???!!!11 你期待的是什么
    • 为字符串赋予新值 lulwut?
    • 然后在新字符串的右端点匹配
    • 最终替换值为 lulwut??

    如果您想继续使用同一个regex preg_replace 然后只需通过提供 1 到第四( $limit )论证:

    preg_replace('/[?7!1]*$/', '?', 'lolwut???!!!111', 1);
    // limit to only one replacement ------------------^ 
    

    至于更好的解决方案,如其他人所说,使用 rtrim .

        2
  •  7
  •   Lizard    14 年前

    结帐 rtrim() - http://php.net/manual/en/function.rtrim.php

    echo rtrim('lolwut','?7!1').'?'; // lolwut?
    echo rtrim('lolwut?','?7!1').'?'; // lolwut?
    echo rtrim('lolwut??','?7!1').'?'; // lolwut?
    echo rtrim('lolwut???!!!11','?7!1').'?'; // lolwut?
    echo rtrim('lolwut1??!7!11','?7!1').'?'; // lolwut?
    

    特里姆威尔 Strip whitespace (or other characters) from the end of a string

    第二个论点:

    还可以通过charlist参数指定要删除的字符。只需列出所有要删除的字符。用…可以指定字符范围。

        3
  •  1
  •   SirDarius    14 年前

    您应该使用修剪功能:

    echo trim('lolwut???!!!11', '?7!1');
    

    输出为:

    lolwut