Удаление пробелов и всего, что не является буквенно-цифровым

Я пытаюсь удалить все, что не является буквенно-цифровым или является пробелом с _:

$filename = preg_replace("([^a-zA-Z0-9]|^\s)", "_", $filename);

Что я здесь делаю не так, похоже, не работает. Я пробовал несколько комбинаций регулярных выражений ... (и я вообще не очень умный).


person jonnnnnnnnnie    schedule 17.11.2010    source источник
comment
Я немного запутался - вы хотите заменить пробелы на _ или нет?   -  person Mike Park    schedule 18.11.2010
comment
Ну, во-первых, вам удалось пренебречь несколькими символами: ˋunichars -a '[\p{Alpha}\p{Number}]' '[^a-zA-Z0-9]' | wc -lˋ == 14717. Не лучшее место для начала.   -  person tchrist    schedule 18.11.2010
comment
Вы должны поместить \s в квадратные скобки. В противном случае ^\s соответствует только пробелам в начале ^ темы. Также используйте /../ для заключения, круглые скобки предназначены только для захвата.   -  person mario    schedule 18.11.2010
comment
Да, я хочу заменить пробелы и все, что не является буквенно-цифровым символом подчеркивания _   -  person jonnnnnnnnnie    schedule 18.11.2010
comment
[^\pL\pN] - любой отдельный неалфавитно-цифровой символ.   -  person tchrist    schedule 18.11.2010


Ответы (4)


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

$filename = preg_replace("/[^a-zA-Z0-9 ]/", "_", $filename);
person cdhowie    schedule 17.11.2010
comment
Я предлагаю учесть остальные почти 15000 символов, о которых вы забыли. - person tchrist; 18.11.2010

$filename = preg_replace('~[\W\s]~', '_', $filename);

Если я правильно понял ваш вопрос, вы хотите заменить любой пробел (\ s) или не буквенно-цифровой (\ W) символ на '_'. Это должно подойти. Обратите внимание, что \ W - это прописные буквы, а не строчные \ w, которые соответствуют буквенно-цифровым символам.

person lheurt    schedule 18.11.2010
comment
Значение \W варьируется от одного варианта к другому, но в PHP он соответствует любому символу, который не является символом слова ASCII, то есть [A-Za-z0-9_]. Это включает в себя пробельные символы ASCII (поэтому \s является избыточным) и буквенно-цифровые символы из других скриптов. Даже латинские буквы с диакритическими знаками \W считаются несловесными символами. - person Alan Moore; 18.11.2010

Решение, которое работает для меня:

$filename = preg_replace('/\W+/', '_', $filename);

+ соответствует блокам из одного или нескольких случаев \W пробелов, которые включают пробелы и все не буквенно-цифровые символы.

person WonderWorker    schedule 14.10.2013

Пытаться

$filename = preg_replace("/[a-zA-Z0-9]|\s/", "_", $filename);
person Tableking    schedule 18.11.2010
comment
Вот это да. Гм, например, что это \s делает вне класса персонажей? А как насчет тысяч буквенно-цифровых символов, о которых вы забыли, а? - person tchrist; 18.11.2010