Предположим, у меня это:
$hello = "Hello, is StackOverflow a helpful website!? Yes!";
и я хочу снять пунктуацию так, чтобы она выводилась как:
hello_is_stackoverflow_a_helpful_website_yes
Как я могу это сделать?
# to keep letters & numbers $s = preg_replace('/[^a-z0-9]+/i', '_', $s); # or... $s = preg_replace('/[^az\d]+/i', '_', $s); # to keep letters only $s = preg_replace('/[^az]+/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);
для строки
$s = "Hello, is StackOverflow a helpful website!? Yes!";
результат (для всех примеров)
Hello_is_StackOverflow_a_helpful_website_Yes_
Наслаждайтесь!
function strip_punctuation($string) { $string = strtolower($string); $string = preg_replace("/[:punct:]+/", "", $string); $string = str_replace(" +", "_", $string); return $string; }
Сначала строка преобразуется в нижний регистр, затем пунктуация удаляется, затем пробелы заменяются символом подчеркивания (это будет обрабатывать одно или несколько пробелов, поэтому, если кто-то помещает два пробела, он будет заменен только одним подчеркиванием).
Без регулярных выражений:
<?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 ?>
Я бы пошел с чем-то вроде этого:
$str = preg_replace('/[^\w\s]/', '', $str);
Я не знаю, является ли это более широким, чем вы ищете, но это похоже на то, что вы пытаетесь сделать.
Я также замечаю, что вы заменили пробелы символами подчеркивания в своем примере. Код, который я бы использовал для этого:
$str = preg_replace('/\s+/', '_', $str);
Обратите внимание, что это также приведет к краху нескольких пробелов в один знак подчеркивания.