【问题标题】:PHP remove special character from stringPHP从字符串中删除特殊字符
【发布时间】:2011-08-29 17:10:35
【问题描述】:

我在删除特殊字符时遇到问题。我想删除除 "( ) / . % - &" 之外的所有特殊字符,因为我将该字符串设置为标题。

我编辑了原始代码(如下所示):

preg_replace('/[^a-zA-Z0-9_ -%][().][\/]/s', '', $String);

但这不适用于删除特殊字符,例如:“’s”、““”、“—等。

原始代码:(这有效,但它删除了这些字符:“( ) / . % - &”)

preg_replace('/[^a-zA-Z0-9_ -]/s', '', $String);

【问题讨论】:

  • 这些“特殊字符”似乎是 UTF-8 等多字节字符编码的编码字符序列。 ’ 是字符 (U+ 2019) 以 UTF-8 (0xE28099) 编码并使用像 Windows-1252 这样的单字节字符编码进行解释时的结果。
  • 我实际上是在寻找这个:preg_replace('/[^a-zA-Z0-9_ -]/s', '', $String);。谢谢!

标签: php regex string preg-replace


【解决方案1】:

您的点匹配所有字符。转义它(和其他特殊字符),如下所示:

preg_replace('/[^a-zA-Z0-9_ %\[\]\.\(\)%&-]/s', '', $String);

【讨论】:

  • 您不需要在字符类中转义 [.()
  • -1 您的解释是错误的,但是您的正则表达式确实(意外地)起作用,因为您将 - 放在角色类的末尾,并且大多数情况下额外的转义不会造成伤害。 @user453089 的问题是 _ -% 部分,他在其中创建了从空间到 % 的范围。我也不明白为什么它会起作用,因为他连续创建了 3 个字符类。
  • 其实我是故意把连字符移到字符类末尾的,不过你说得对,我没有叫出来。
【解决方案2】:
preg_replace('#[^\w()/.%\-&]#',"",$string);

【讨论】:

    【解决方案3】:

    你想要str replace,因为就性能而言,它要便宜得多而且仍然满足你的需求!

    $title = str_replace( array( '\'', '"', ',' , ';', '<', '>' ), ' ', $rawtitle);
    

    (除非这完全是关于安全性和 sql 注入的,在这种情况下,我宁愿使用允许字符的积极列表……更好的是,坚持经过测试、证明的例程。)

    顺便说一句,因为 OP 谈到了标题设置:我不会用空格代替特殊字符。一个肤浅的空间比两个单词粘在一起更不是问题......

    【讨论】:

      【解决方案4】:

      很好的尝试!我认为您只需要进行一些小的更改:

      • 转义字符类中的方括号([])(也由 [] 指示)
      • 转义转义字符 (\) 本身
      • 另外,- 有一个特殊之处:如果它在两个字符之间,则表示范围,但如果在开头或结尾,则表示文字 - 字符。

      你会想要这样的:

      preg_replace('/[^a-zA-Z0-9_%\[().\]\\/-]/s', '', $String);
      

      如果您想进一步了解此主题,请参阅http://docs.activestate.com/activeperl/5.10/lib/pods/perlrecharclass.html#special_characters_inside_a_bracketed_character_class

      【讨论】:

      • 谢谢,匿名者。我现在明白了。
      • “另外还有一个怪癖——特别之处:”,啊哈 - Anonymoose - 今天掉进了那个陷阱,我想知道是什么原因造成的。谢谢!
      【解决方案5】:
      <?php
      $string = '`~!@#$%^&^&*()_+{}[]|\/;:"< >,.?-<h1>You .</h1><p> text</p>'."'";
      $string=strip_tags($string,"");
      $string = preg_replace('/[^A-Za-z0-9\s.\s-]/','',$string); 
      echo $string = str_replace( array( '-', '.' ), '', $string);
      ?>
      

      【讨论】:

      • 请在您的代码中添加解释。你在你的 char 类中复制了\s
      【解决方案6】:
      preg_replace('/[^a-zA-Z0-9_ \-()\/%-&]/s', '', $String);
      

      【讨论】:

        【解决方案7】:
        mysqli_set_charset($con,"utf8");
        $title = ' LEVEL – EXTENDED'; 
        $newtitle = preg_replace('/[^(\x20-\x7F)]*/','', $title);     
        echo $newtitle;
        
        Result :  LEVEL EXTENDED
        

        通过应用下面的mysql连接代码可以删除许多奇怪的字符。 但在某些情况下要删除这种类型的奇怪字符,例如 - 您可以使用 preg_replace 上述格式。

        【讨论】:

          【解决方案8】:

          example

          /**
           * nv_get_plaintext()
           *
           * @param mixed $string
           * @return
           */
          function nv_get_plaintext( $string, $keep_image = false, $keep_link = false )
          {
              // Get image tags
              if( $keep_image )
              {
                  if( preg_match_all( "/\<img[^\>]*src=\"([^\"]*)\"[^\>]*\>/is", $string, $match ) )
                  {
                      foreach( $match[0] as $key => $_m )
                      {
                          $textimg = '';
                          if( strpos( $match[1][$key], 'data:image/png;base64' ) === false )
                          {
                              $textimg = " " . $match[1][$key];
                          }
                          if( preg_match_all( "/\<img[^\>]*alt=\"([^\"]+)\"[^\>]*\>/is", $_m, $m_alt ) )
                          {
                              $textimg .= " " . $m_alt[1][0];
                          }
                          $string = str_replace( $_m, $textimg, $string );
                      }
                  }
              }
          
              // Get link tags
              if( $keep_link )
              {
                  if( preg_match_all( "/\<a[^\>]*href=\"([^\"]+)\"[^\>]*\>(.*)\<\/a\>/isU", $string, $match ) )
                  {
                      foreach( $match[0] as $key => $_m )
                      {
                          $string = str_replace( $_m, $match[1][$key] . " " . $match[2][$key], $string );
                      }
                  }
              }
          
              $string = str_replace( ' ', ' ', strip_tags( $string ) );
              return preg_replace( '/[ ]+/', ' ', $string );
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-04-11
            • 2016-01-23
            • 2019-11-09
            相关资源
            最近更新 更多