2012-02-20 2 views
0

Я пытаюсь подготовить строку для использования в качестве списка каталогов. Я работаю с введенными пользователем названиями и должен удалить все, кроме букв и цифр, а затем заменить пробелы _ .. Мне удалось приблизиться к этому с помощью preg_replace, но у вас нет часов, чтобы узнать, как входы и выходы Regex в данный момент.Удаление всех букв и цифр, замена пробелов. PHP Regex

Ниже приведен пример строки = This is a -string- that has /characters & other stuff! Let's filter it. То, что я снимаю, это: this_is_a_string_that_has_characters_other_stuff_lets_filter_it

Мне удалось сблизиться с этим кодом, но места, где персонаж был удален после того, как он остался. Результат был двойной, что приемлемо, но не то, что я снимал.

Любая помощь была бы принята с благодарностью. Вот моя попытка:

<?php 
$string = " This is a -string- that has /characters & other stuff! Let's filter it?"; 
$cleansedstring = trim($string); 
$cleansedstring = strtolower($cleansedstring); 
$cleansedstring = preg_replace('/[^ \w]+/', '', $cleansedstring); 
$cleansedstring = preg_replace('[\s]', '_', $cleansedstring); 
echo $cleansedstring; 
?> 

ОБНОВЛЕНО Вот что я понял, от некоторых предложений здесь, кажется, довольно чистый и выводит строку я снимала для .. предложения по улучшению?

$string = " This is a -string- _that has /characters & other stuff! Let's filter it?23"; 
$cleansedstring = trim($string); 
$cleansedstring = strtolower($cleansedstring); 
$cleansedstring = preg_replace('/[^ \pL \pN]/', '', $cleansedstring); 
$cleansedstring = preg_replace('[\s+]', '_', $cleansedstring); 
echo $cleansedstring; 
+1

Письма '' pL'. Числа - '\ pN'. – tchrist

+0

Спасибо, что помогло .. :) – NightMICU

ответ

2

Регулярное выражение для удаления нежелательных символов не должно быть + там, и тот, который проверяет наличие пробелов нуждается в + после него.

+0

Aha! Именно то, что я искал .. как бы объединить эти два в один 'preg_replace()'? – NightMICU

+1

«+» в первом регулярном выражении - это хорошо, но добавление «+» ко второму регулярному выражению - вот что решает проблему. @NightMICU, я думаю, вы должны принять этот ответ. (И нет, вы не можете объединить их в одно регулярное выражение.) –

+0

Спасибо вам обоим :) – NightMICU

0

Вот старая функция я - немного модифицирован для использования подчеркивает:

public function make_url_friendly($string) 
{ 
    $string = trim($string); 

    // weird chars to nothing 
    $string = preg_replace('/(\W\B)/', '', $string); 

    // whitespaces to underscore 
    $string = preg_replace('/[\W]+/', '_', $string); 

    // dash to underscore 
    $string = str_replace('-', '_', $string); 

    // make it all lowercase 
    $string = strtolower($string); 

    return $string; 
} 

Это должно делать то, что вам нужно

+0

Нет, это бессмысленно по-разному. – tchrist

+0

Это оторвано от чего-то другого, где у меня есть варианты - отсюда его разделение – BenOfTheNorth

+0

Я ценю предложение, но когда я попробовал это, я закончил с '_this_is_a__string__that_has_characters_other_stuff_let_s_filter_it_' .. – NightMICU

0

Попробуйте это:

<?php 
$string = " This is a -string- that has /characters & & other stuff! Let's filter it?"; 
$cleanstring = strtolower(trim(preg_replace('#\W+#', '_', $string), '_')); 
1

Это тоже работает:

$s = "This is a -string- that has /characters & other stuff! Let's filter it"; 
echo "ORIG: [{$s}]<br />"; 
$s = preg_replace("/[^0-9a-zA-Z\s]/","",$s); 
$s = preg_replace("/\s[\s]+/"," ",$s); 
$s = preg_replace("/\s/","_",$s); 
$s = strtolower($s); 
echo "NEW: [{$s}]<br />"; 

// output is 
// ORIG: [This is a -string- that has /characters & other stuff! Let's filter it] 
// NEW: [this_is_a_string_that_has_characters_other_stuff_lets_filter_it] 
Смежные вопросы