how to strip punctuation in php

后端 未结 6 1387
长发绾君心
长发绾君心 2021-02-01 22:45

How can I strip punctuation except for these characters . = $ \' - %

相关标签:
6条回答
  • 2021-02-01 23:00

    Here's a neat way to do it:

    preg_replace("#[[:punct:]]#", "", $target);
    
    0 讨论(0)
  • 2021-02-01 23:00
    preg_replace("[^-\w\d\s\.=$'€%]",'',$subject)
    

    although it would be more correct and easy to specify the characters you want to strip, instead of characters (from an unknown set) you don't want to strip.

    0 讨论(0)
  • 2021-02-01 23:03

    Try:

    preg_replace("/[^\w-\p{L}\p{N}\p{Pd}\$\.€%']/", "", 'YOUR DATA');

    You didn't mentioned if you wanted spaces or not, so that will strip that too.

    0 讨论(0)
  • 2021-02-01 23:09

    The problem:

    Need to save string as alphaNum with specific punctuation and don't want to completely discard characters with special punctuation.

    The solution:

    class ClassName {
    
      protected static $cleanChars = array(
        '<' => '', '>' => '', ''' => '', '&' => '',
        '"' => '', 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'Ae',
        'Ä' => 'A', 'Å' => 'A', 'Ā' => 'A', 'Ą' => 'A', 'Ă' => 'A', 'Æ' => 'Ae',
        'Ç' => 'C', 'Ć' => 'C', 'Č' => 'C', 'Ĉ' => 'C', 'Ċ' => 'C', 'Ď' => 'D', 'Đ' => 'D',
        'Ð' => 'D', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ē' => 'E',
        'Ę' => 'E', 'Ě' => 'E', 'Ĕ' => 'E', 'Ė' => 'E', 'Ĝ' => 'G', 'Ğ' => 'G',
        'Ġ' => 'G', 'Ģ' => 'G', 'Ĥ' => 'H', 'Ħ' => 'H', 'Ì' => 'I', 'Í' => 'I',
        'Î' => 'I', 'Ï' => 'I', 'Ī' => 'I', 'Ĩ' => 'I', 'Ĭ' => 'I', 'Į' => 'I',
        'İ' => 'I', 'IJ' => 'IJ', 'Ĵ' => 'J', 'Ķ' => 'K','Ł' => 'K', 'Ľ' => 'K',
        'Ĺ' => 'K', 'Ļ' => 'K', 'Ŀ' => 'K', 'Ñ' => 'N', 'Ń' => 'N', 'Ň' => 'N',
        'Ņ' => 'N', 'Ŋ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O',
        'Ö' => 'Oe', 'Ö' => 'Oe', 'Ø' => 'O', 'Ō' => 'O', 'Ő' => 'O', 'Ŏ' => 'O',
        'Œ' => 'OE', 'Ŕ' => 'R', 'Ř' => 'R', 'Ŗ' => 'R', 'Ś' => 'S', 'Š' => 'S',
        'Ş' => 'S', 'Ŝ' => 'S', 'Ș' => 'S', 'Ť' => 'T', 'Ţ' => 'T', 'Ŧ' => 'T',
        'Ț' => 'T', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'Ue', 'Ū' => 'U',
        'Ü' => 'Ue', 'Ů' => 'U', 'Ű' => 'U', 'Ŭ' => 'U', 'Ũ' => 'U', 'Ų' => 'U',
        'Ŵ' => 'W', 'Ý' => 'Y', 'Ŷ' => 'Y', 'Ÿ' => 'Y', 'Ź' => 'Z', 'Ž' => 'Z',
        'Ż' => 'Z', 'Þ' => 'T', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a',
        'ä' => 'ae', 'ä' => 'ae', 'å' => 'a', 'ā' => 'a', 'ą' => 'a', 'ă' => 'a',
        'æ' => 'ae', 'ç' => 'c', 'ć' => 'c', 'č' => 'c', 'ĉ' => 'c', 'ċ' => 'c',
        'ď' => 'd', 'đ' => 'd', 'ð' => 'd', 'è' => 'e', 'é' => 'e', 'ê' => 'e',
        'ë' => 'e', 'ē' => 'e', 'ę' => 'e', 'ě' => 'e', 'ĕ' => 'e', 'ė' => 'e',
        'ƒ' => 'f', 'ĝ' => 'g', 'ğ' => 'g', 'ġ' => 'g', 'ģ' => 'g', 'ĥ' => 'h',
        'ħ' => 'h', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ī' => 'i',
        'ĩ' => 'i', 'ĭ' => 'i', 'į' => 'i', 'ı' => 'i', 'ij' => 'ij', 'ĵ' => 'j',
        'ķ' => 'k', 'ĸ' => 'k', 'ł' => 'l', 'ľ' => 'l', 'ĺ' => 'l', 'ļ' => 'l',
        'ŀ' => 'l', 'ñ' => 'n', 'ń' => 'n', 'ň' => 'n', 'ņ' => 'n', 'ʼn' => 'n',
        'ŋ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'oe',
        'ö' => 'oe', 'ø' => 'o', 'ō' => 'o', 'ő' => 'o', 'ŏ' => 'o', 'œ' => 'oe',
        'ŕ' => 'r', 'ř' => 'r', 'ŗ' => 'r', 'š' => 's', 'ù' => 'u', 'ú' => 'u',
        'û' => 'u', 'ü' => 'ue', 'ū' => 'u', 'ü' => 'ue', 'ů' => 'u', 'ű' => 'u',
        'ŭ' => 'u', 'ũ' => 'u', 'ų' => 'u', 'ŵ' => 'w', 'ý' => 'y', 'ÿ' => 'y',
        'ŷ' => 'y', 'ž' => 'z', 'ż' => 'z', 'ź' => 'z', 'þ' => 't', 'ß' => 'ss',
        'ſ' => 'ss', 'ый' => 'iy', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G',
        'Д' => 'D', 'Е' => 'E', 'Ё' => 'YO', 'Ж' => 'ZH', 'З' => 'Z', 'И' => 'I',
        'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O',
        'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F',
        'Х' => 'H', 'Ц' => 'C', 'Ч' => 'CH', 'Ш' => 'SH', 'Щ' => 'SCH', 'Ъ' => '',
        'Ы' => 'Y', 'Ь' => '', 'Э' => 'E', 'Ю' => 'YU', 'Я' => 'YA', 'а' => 'a',
        'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'yo',
        'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l',
        'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's',
        'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch',
        'ш' => 'sh', 'щ' => 'sch', 'ъ' => '', 'ы' => 'y', 'ь' => '', 'э' => 'e',
        'ю' => 'yu', 'я' => 'ya'
      );
    
      public static function clean($string, $allowed=array(), $base="a-zA-Z0-9 "){
        if(empty($allowed) && !$base){ return false; }
        $ignore = "";
        if(is_array($allowed)){
          foreach($allowed as $a){
            $ignore .= preg_quote($a);
          }
        }
        return preg_replace( "/[^{$base}{$ignore}\s]/", "", $string );
      }
    
      public static function alphaNum($string, $allowed=array(), $convert=false){
        if($convert){
          $string = strtr($string, self::$cleanChars);
        }
        return self::clean($string, $allowed, 'a-zA-Z0-9 ');
      }
    
    }
    

    Examples:

    Strip all punctuation:

    ClassName::alpaNum($string);

    Strip all punctuation but convert special chars:

    ClassName::alphaNum($string, null, true);

    Alpha Num + additional punctuation:

    ClassName::alphaNum($string, array('_', '-', ',', '.'));

    Alpha Num + additional punctuation and convert:

    ClassName::alphaNum($string, array('_', '-', ',', '.'), true);

    Conclusion: If you are expecting special chars and don't completely want to discard them you can convert them before checking alphaNum. (eg. on sanitizing file names etc.)

    If discarding the special chars does not have any real impact and is not really expected on the system you can call it without conversion of punctuation to save processing power. (eg. on setting keys for large arrays from strings)

    I got the cleanChars var from here: (I slightly modified it) https://github.com/vanillaforums/Garden/blob/master/library/core/class.format.php

    0 讨论(0)
  • 2021-02-01 23:15
    <?
    $whatToStrip = array("?","!",",",";"); // Add what you want to strip in this array
    $test = "Hi! Am I here?";
    echo $test."\n\n";
    echo str_replace($whatToStrip, "", $test);
    

    Demo here

    or, of course, shorter :

    $test = str_replace(array("?","!",",",";"), "", $test);
    

    Source from 1st example of str_replace manual

    0 讨论(0)
  • 2021-02-01 23:23

    Since you need to match some Unicode characters () it would be sensible to use a regular expression. The pattern \p{P} matches any known punctuation, and the assertion excludes your desired special characters from vanishing:

     $text = preg_replace("/(?![.=$'€%-])\p{P}/u", "", $text);
    
    0 讨论(0)
提交回复
热议问题