regular expression "non-word" characters

5 отговора 326 прегледа
#1

regular expression "non-word" characters

ам ...
искам да махна всички символи от стринг който са "non-word" без - (тире) и " (двоина кавичка)

доста се рових из мануала, но не открих нещо подходящо. Идеята да ги изброявам с разделител | не ми се вижда много елегантна
предложения ?

Break The UnBreakable
Отговор
в отговор на nupaT #2

Re: regular expression "non-word" characters

\W

any "non-word" character


Отговор
в отговор на nupaT #3

Re: regular expression "non-word" characters

$str = preg_replace('#[^\w\-"]#', '', $str);

Everything louder than everything else...

Редактирано от Dakota на

Отговор
в отговор на nupaT #4

Re: regular expression "non-word" characters

Учещ, знам за \W, но това включва и двата символа (тире и кавичка) които искам да останат.
предложението на Dakota ще свърши работа макар че не мога да си обясня защо в следния израз:
$string = "-!@#$%^&*()=+_'.\",";
$string = preg_replace('#[^\w\-" ]#', '', $string);
ми връща и долна четра, а като махна тирето нямам такива проблеми. Но това ще го преживея

Break The UnBreakable
Отговор
в отговор на nupaT #5

Re: regular expression "non-word" characters

щот долната черта е дегизирано тире

Отговор
в отговор на nupaT #6

non-word или non-word + подчертавка?!

Знакът за подчертавка е "word character" и се включва в \w.

Както пише и в документацията :

"A "word" character is any letter or digit or the underscore character, that is, any character which can be part of a Perl "word". The definition of letters and digits is controlled by PCRE's character tables, and may vary if locale-specific matching is taking place (see "Locale support" above). For example, in the "fr" (French) locale, some character codes greater than 128 are used for accented letters, and these are matched by \w."

Това с махането на тирето не мога да го пресъздам при мен. Т.е. махането или слагането на тирето не се отразява по никакъв начин на подчертавката.

Ако искаш да ти маха и подчертавката, тогава използвай това:

$string = preg_replace('#[^\w\-"]|_#', '', $string);

или това:

$string = preg_replace('#[^a-z0-9\-"]#i', '', $string);

което те кефи повече. Аз лично бих използвал втория вариант.

Everything louder than everything else...

Редактирано от Dakota на

Отговор