【问题标题】:String characters replacement PHP字符串字符替换 PHP
【发布时间】:2023-08-18 05:52:02
【问题描述】:

我非常接近解决问题,但是我不知道如何删除字符串周围的空格。例如:' ! ''! '' !' 变为 '!'。这适用于 ?特点, 。字符和其他标点符号。

到目前为止,这是我的代码。它应该采用字符并将它们转换为我所做的北约词,但我的标点符号是错误的。例如,当我不希望标点符号之间有空格时,' ! awesome. .! ' 会变成 ' ! Alfa Whiskey Echo Sierra Oscar Mike Echo . . !'

function to_nato($words){
    $key = array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");
    $translationKey = array("Alfa", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot", "Golf", "Hotel", "India", "Juliet", "Kilo", "Lima", "Mike", "November", "Oscar", "Papa", "Quebec", "Romeo", "Sierra", "Tango", "Uniform", "Victor", "Whiskey", "Xray", "Yankee", "Zulu");
    $strToRet = "";
    for($i = 0; $i < strlen($words); $i++) {
        $letter = substr($words, $i, 1);
        if(ctype_alpha($letter)) {
            for($keySearch = 0; $keySearch < count($key); $keySearch++) {
                $letterToSearch = array_search($key[$keySearch], $key);
                if(strcasecmp($letter, $key[$letterToSearch]) == 0) {
                    $natoLetter = $translationKey[$letterToSearch];
                    $strToRet .= $natoLetter;
                }
            }
        }
        else {
            $strToRet .= $letter;
        }
    }
    $strToRet = preg_replace('/([a-z])([A-Z])/s','$1 $2', $strToRet);
    //$strToRet = str_replace(" ! ", "!", $strToRet, $count);
    return $strToRet;
}

【问题讨论】:

  • 与问题无关,但您应该使用关联数组而不是两个数组来查找字母映射。
  • 我试过你的功能,标点符号前没有多余的空格。标点符号周围唯一的空格是原始字符串中的空格。
  • 我收到" ! Alfa Whiskey Echo Sierra Oscar Mike Echo. .! "
  • 我想使用某种循环并删除那些确切的空格。我使用 preg 替换获得这些空格,但我不希望它们围绕标点符号
  • $letterToSearch = array_search($key[$keySearch], $key); 的意义何在? $letterToSearch$keySearch不一样吗?

标签: php string preg-replace str-replace


【解决方案1】:

尝试将此if(ctype_alpha($letter) 更改为此if(ctype_alpha($letter) || $letter==" ")。我可以去掉结果中的那个空格(使用你在描述中提供的输入字符串)。

【讨论】:

    【解决方案2】:

    从原始字符串中删除标点符号周围的空格:

    $words = preg_replace('/\s*([^\w\s]+)\s*/', '$1', $words);
    

    DEMO

    【讨论】:

    • 您的解决方案导致!AlfaWhiskeyEchoSierraOscarMikeEcho..!,据我了解,这不是 topicstarter 想要的 :)
    • 我希望它通过一个测试用例,例如:Failed asserting that two strings are equal。预期:'.Yankee' 实际:'。洋基队'
    • @KaranGoda 我添加了一个演示,表明它可以正常工作。每个拼音字母之间都有空格。
    • codewars 会不会有问题?因为它在那里失败了
    • @Barmar 我在这里试过writephponline.com,结果不一样。也许不同的php版本/设置?在您提供的网站上确实有效,抱歉。