PHP remove special character from string

    |
  • Added:
  • |
  • In: Basic PHP

I have problems with removing special characters. I want to remove all special characters except "( ) / . % - &", because I'm setting that string as a title.

I edited code from the original (look below):

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

But this is not working to remove special characters like: "’s, "“", "â€", among others.

original code: (this works but it removes these characters: "( ) / . % - &")

preg_replace('/[^a-zA-Z0-9_ -]/s', '', $String); 
This Question Has 7 Answeres | Orginal Question | user453089
<?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); ?> 

See 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 ); } 
preg_replace('/[^a-zA-Z0-9_ \-()\/%-&]/s', '', $String); 
preg_replace('#[^\w()/.%\-&]#',"",$string); 

Your dot is matching all characters. Escape it (and the other special characters), like this:

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

You want str replace, because performance-wise it's much cheaper and still fits your needs!

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

(Unless this is all about security and sql injection, in that case, I'd rather to go with a POSITIVE list of ALLOWED characters... even better, stick with tested, proven routines.)

Btw, since the OP talked about title-setting: I wouldn't replace special chars with nothing, but with a space. A superficious space is less of a problem than two words glued together...

Good try! I think you just have to make a few small changes:

  • Escape the square brackets ([ and ]) inside the character class (which are also indicated by [ and ])
  • Escape the escape character (\) itself
  • Plus there's a quirk where - is special: if it's between two characters, it means a range, but if it's at the beginning or the end, it means the literal - character.

You'll want something like this:

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

See http://docs.activestate.com/activeperl/5.10/lib/pods/perlrecharclass.html#special_characters_inside_a_bracketed_character_class if you want to read up further on this topic.


Search
I am...

Sajjad Hossain

I have five years of experience in web development sector. I love to do amazing projects and share my knowledge with all.

Connect Social With PHPAns
Top