regex - PHP strip punctuation

943

Let's say I have this:

$hello = "Hello, is StackOverflow a helpful website!? Yes!";

and I want to strip punctuation so it outputs as:

hello_is_stackoverflow_a_helpful_website_yes

How can I do that?

367

Answer

Solution:

# to keep letters & numbers
$s = preg_replace('/[^a-z0-9]+/i', '_', $s); # or...
$s = preg_replace('/[^a-z\d]+/i', '_', $s);

# to keep letters only
$s = preg_replace('/[^a-z]+/i', '_', $s); 

# to keep letters, numbers & underscore
$s = preg_replace('/[^\w]+/', '_', $s);

# same as third example; suggested by @tchrist; ^\w = \W
$s = preg_replace('/\W+/', '_', $s);

for string

$s = "Hello, is StackOverflow a helpful website!? Yes!";

result (for all examples) is

Hello_is_StackOverflow_a_helpful_website_Yes_

Enjoy!

933

Answer

Solution:

function strip_punctuation($string) {
    $string = strtolower($string);
    $string = preg_replace("/[:punct:]+/", "", $string);
    $string = str_replace(" +", "_", $string);
    return $string;
}

First the string is converted to lower case, then punctuation is removed, then spaces are replaced with underscores (this will handle one or more spaces, so if someone puts two spaces it will be replaced by only one underscore).

53

Answer

Solution:

Without regular expressions:

<?php
  $hello = "Hello, is StackOverflow a helpful website!? Yes!"; // original string
  $unwantedChars = array(',', '!', '?'); // create array with unwanted chars
  $hello = str_replace($unwantedChars, '', $hello); // remove them
  $hello = strtolower($hello); // convert to lowercase
  $hello = str_replace(' ', '_', $hello); // replace spaces with underline
  echo $hello; // outputs: hello_is_stackoverflow_a_helpful_website_yes
?>
604

Answer

Solution:

I'd go with something like this:

$str = preg_replace('/[^\w\s]/', '', $str);

I don't know if that's more broad than you're looking for, but it sounds like what you're trying to do.

I also notice you've replaced spaces with underscores in your sample. The code I'd use for that is:

$str = preg_replace('/\s+/', '_', $str);

Note that this will also collapse multiple spaces into one underscore.

People are also looking for solutions to the problem: php - How can you loop through a mysql_fetch_array() with a for loop?

Source

Didn't find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.

Ask a Question

Write quick answer

Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.

Similar questions

Find the answer in similar questions on our website.