【问题标题】:How to replace string with another string and keep case in php and mysql?如何用另一个字符串替换字符串并在php和mysql中保持大小写?
【发布时间】:2017-11-11 00:33:07
【问题描述】:

我正在尝试做某种能够保持文本大写/小写的翻译器。 我也需要在 PHP 字符串和 MySQL 查询中替换它。

例子:

Potato is jumping all over the PLACE.
Potato is jumping all over the pLAcE. (optional)
Potato is jumping all over the place.
Potato is jumping all over the Place.

我想用“花园”代替“地方”这个词。

Potato is jumping all over the GARDEN.
Potato is jumping all over the gARdEe. (optional)
Potato is jumping all over the garden.
Potato is jumping all over the Garden.

它也应该适用于短语。

【问题讨论】:

    标签: php mysql string replace


    【解决方案1】:

    感谢@LadaB - 这是一个非常有用的功能,但它也替换了部分单词匹配。有时你可能想要这个,但在其他情况下你不会,例如,如果你有:

    $source = 'mom';
    $replacement = 'mum'; // british spelling of "mom"
    $string = 'Be in the moment with your Mom.';
    

    你会得到:“和你妈妈一起妈妈。”

    所以,我添加了一个选项来使匹配“仅整个单词”。

    我发现了另一个问题,即多字节字符会在大写字母结束的地方发生偏移,这似乎可以通过更改来解决。 mb_substrsubstr

    我还删除了未使用的:

    $remaining = substr($string, $pos + strlen($source));
    

    我的最新(我认为可以正常工作)版本是:

    function replaceWithCase($source, $replacement, $string, $wholeWordOnly = false) {
    
        $pos = 0;
    
        while (($pos = strpos(strtolower($string), strtolower($source), $pos))!== false) {
    
            if($wholeWordOnly) {
                preg_match("/\b".$string[$pos]."/", $string[($pos-1)] . $string[$pos], $start);
                preg_match("/".$string[($pos+strlen($source)-1)]."\b/", $source . $string[($pos+strlen($source))], $end);
            }
    
            if(($wholeWordOnly && $start && $end) || !$wholeWordOnly) {
    
                $substr = substr($string, $pos, strlen($source));
    
                if (ctype_upper($substr)) {
                    $string = substr_replace($string,strtoupper($replacement),$pos,strlen($source));
                    continue;
                }
    
                $substrParts = preg_split('//u', $substr, null, PREG_SPLIT_NO_EMPTY);
                $replaceParts = preg_split('//u', $replacement, null, PREG_SPLIT_NO_EMPTY);
                $newWord = '';
    
                foreach ($replaceParts as $k => $rp) {
                    if (array_key_exists($k,$substrParts))
                        $newWord .= ctype_upper($substrParts[$k]) ? mb_strtoupper($rp) : mb_strtolower($rp);
                    else
                        $newWord .= $rp;
                }
    
                $string = substr_replace($string,$newWord,$pos,strlen($source));
    
            }
    
            $pos = $pos + strlen($source);
    
        }
    
        return $string;
    }
    

    希望对您或其他人有所帮助。

    【讨论】:

      【解决方案2】:

      所以我最终设法创建了自己的函数。不过感谢您的帮助和启发。

      function replaceWithCase($source, $replacement, $string, $pos = 0) {
      
          while (($pos = strpos(strtolower($string), strtolower($source), $pos))!== false) {
              $substr = mb_substr($string, $pos, strlen($source));
              $remaining = mb_substr($string, $pos + strlen($source));
      
              if (ctype_upper($substr)) {
                  $string = substr_replace($string,strtoupper($replacement),$pos,strlen($source));
                  continue;
              }
      
              $substrParts = preg_split('//u', $substr, null, PREG_SPLIT_NO_EMPTY);
              $replaceParts = preg_split('//u', $replacement, null, PREG_SPLIT_NO_EMPTY);
              $newWord = '';
      
              foreach ($replaceParts as $k => $rp) {
                  if (array_key_exists($k,$substrParts))
                      $newWord .= ctype_upper($substrParts[$k]) ? mb_strtoupper($rp) : mb_strtolower($rp);
                  else
                      $newWord .= $rp;  
              }
              $string = substr_replace($string,$newWord,$pos,strlen($source));
              $pos = $pos + strlen($source);
          }
      
          return $string;
      }
      
      echo replaceWithCase("place", "garden", "Potato is jumping all over the PLACE");
      echo "<br>";
      echo replaceWithCase("jumping", "running", "Potato is jumping all over the pLAcE");
      echo "<br>";
      echo replaceWithCase("jumping", "cry", "Potato is jumping all over the place");
      echo "<br>";
      echo replaceWithCase("all", "", "Potato is jumping all over the Place");
      echo "<br>";
      echo replaceWithCase(" ", ";", "Potato is jumping all over the Place", 10);
      echo "<br>";
      

      输出:

      Potato is jumping all over the GARDEN
      Potato is running all over the pLAcE
      Potato is cry all over the place
      Potato is jumping over the Place
      Potato is jumping;all;over;the;Place
      

      【讨论】:

        【解决方案3】:
        Use "stripos" php function
        
        
        $str = 'Potato is jumping all over the pLAcEs.';
        $str_new = "garden";
        
        $str1 = str_split($str_new);
        $pos    = stripos($str,'places');
        $string = substr($str,$pos,6);
        
         $extrct = str_split($string);
        
        
        $var = '';
        
        foreach ($extrct as $key => $value) {
            if(ctype_upper($value))
            {
                $var .= strtoupper($str1[$key]);        
            }else{
                $var .= strtolower($str1[$key]);        
            }
        }
        
        
        
        $new_string = str_replace($string, $var, $str);
        
        
        echo $new_string; //Potato is jumping all over the gARdEn.
        

        【讨论】:

          【解决方案4】:
          function stringReplace($findStr, $replaceStr, $str)
          {
              $isLowerStr = true;
              for($i=0; $i<strlen($findStr); $i++){
                  if(ord($findStr[$i]) >= 97 && ord($findStr[$i])<=122){
                      if(ord($replaceStr[$i]) >= 65 && ord($replaceStr[$i])<=96){
                          $replaceStr[$i] = strtolower($replaceStr[$i]);
                      }else{
                          $replaceStr[$i] = $replaceStr[$i];
                      }
                  }else{
                      $isLowerStr = false;
                      $replaceStr[$i] = strtoupper($replaceStr[$i]);
                  }
              }
              if($isLowerStr == false){
                  if(strlen($replaceStr) > strlen($findStr)){
                      for($i=0;$i<(strlen($replaceStr)-strlen($findStr));$i++){
                          if(strtoupper($findStr) == $findStr){
                                  $replaceStr[strlen($findStr)+$i] = strtoupper($replaceStr[strlen($findStr)+$i]);
                          }else{
                              $replaceStr[strlen($findStr)+$i] = strtolower($replaceStr[strlen($findStr)+$i]);
                          }
                      }
                  }
              }
              echo str_replace($findStr, $replaceStr, $str);die;
          }
          $findStr = 'Place';
          $replaceStr = 'garden';
          echo stringReplace($findStr, $replaceStr, 'Potato is jumping all over the '.$findStr.'.');
          

          【讨论】:

            【解决方案5】:

            我创建了一个函数,可以为您替换单词并保留大小写。

            function replaceWithCase($source, $replacement, $string) {
                // Does the string contain the source word?
                if (strpos($string, $source) === false) {
                    return false;
                }
            
                // If everything is uppercase, return the replacement fully uppercase
                if (ctype_upper($source)) {
                    return str_replace($source, strtoupper($replacement));
                }
            
                // Set an array to work with
                $characters = array();
            
                // Split the source into characters
                $sourceParts = explode('', $source);
            
                // Loop throug the characters and set the case
                foreach ($sourceParts as $k => $sp) {
                    if (ctype_upper($sp)) {
                        $characters[$k] = true;
                    } else {
                        $characters[$k] = false;
                    }
                }
            
                // Split the replacement into characters
                $replacementParts = explode('', $replacement);
            
                // Loop through characters and compare their case type
                foreach ($replacementParts as $k => $rp) {
                    if (array_key_exists($k, $characters) && $characters[$k] === true) {
                        $newWord[] = strtoupper($rp);
                    } else {
                        $newWord[] = strtolower($rp);
                    }
                }
            
                return substr_replace($source, implode('', $newWord), $string);
            }
            
            // usage
            echo replaceWithCase('AppLes', 'bananas', 'Comparing AppLes to pears');
            

            注意:它未经测试,可能需要一些调整

            【讨论】:

              猜你喜欢
              • 2016-12-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-05-14
              • 2020-05-07
              • 1970-01-01
              • 2013-10-31
              相关资源
              最近更新 更多