X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Фильтр
unnormal
unnormal
Topic Starter сообщение 26.8.2010, 16:42; Ответить: unnormal
Сообщение #1


Как лучше написать фильтр чтобы в строке только оставались буквы и цифры.
А то кроме как написать километровый regex идей не приходит.

Может есть какая-то функция?
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
Mulder_hb
сообщение 26.8.2010, 17:26; Ответить: Mulder_hb
Сообщение #2


[PHP]preg_match_all('(\w+)', $subject, $result);[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
unnormal
unnormal
Topic Starter сообщение 26.8.2010, 17:33; Ответить: unnormal
Сообщение #3


Конечно спасибо, но вроде оно удалит только спцсимволы \r \n \t, а вот от остальных (,?[]{}()) как избавиться?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Apay
Apay
сообщение 26.8.2010, 18:17; Ответить: Apay
Сообщение #4


[php]$dest = preg_replace( '#[^\\w\\d]+#', '', $source );[/php] длина поменьше километра :rolleyes:

Mulder, preg_match - только проверяет
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
Mulder_hb
сообщение 26.8.2010, 20:49; Ответить: Mulder_hb
Сообщение #5


(unnormal @ 26.8.2010, 20:33) *
Конечно спасибо, но вроде оно удалит только спцсимволы \r \n \t, а вот от остальных (,?[]{}()) как избавиться?

Читать до полного просветления.
(Apay @ 26.8.2010, 21:17) *
Mulder, preg_match - только проверяет

Я ведь не зря поставил третий аргумент в функции, как вы думаете?
(Apay @ 26.8.2010, 21:17) *
#[^\\w\\d]+#

Вам тоже не мешало бы изучить, что значит \w и ^.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Apay
Apay
сообщение 26.8.2010, 21:41; Ответить: Apay
Сообщение #6


Mulder, прежде чем писать, прочтите доки, для особо сообразительных поясняю

(Mulder_hb @ 26.8.2010, 23:49) *
Я ведь не зря поставил третий аргумент в функции, как вы думаете?
в третий аргумент заносится массив совпадений, для единичного случая совпадения

(Mulder_hb @ 26.8.2010, 23:49) *
Вам тоже не мешало бы изучить, что значит \w и ^.
'#[^\\w\\d]+#' означает "все не-буквы и не-цифры"
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
Mulder_hb
сообщение 26.8.2010, 22:45; Ответить: Mulder_hb
Сообщение #7


Итак:
1. \w == [a-zA-Z_0-9] , т.е. - \w уже содержит в себе все буквы и все цифры плюс знак подчеркивания. \w\d это масло масленое.
(Apay @ 27.8.2010, 00:41) *
в третий аргумент заносится массив совпадений, для единичного случая совпадения

А теперь прочтите вопрос автора и догадайтесь, что попадет в карман с индексом 1. Надеюсь вам не надо говорить, что попадет в карман с индексом 0?
(Apay @ 27.8.2010, 00:41) *
'#[^\\w\\d]+#' означает "все не-буквы и не-цифры"

И где ж тут записан пресловутый отрицательный класс? Ваша запись означает: "в начале строки идет либо буква, либо цифра, либо знак подчеркивания, потом идет цифра. Вся эта конструкция повторяется минимум один раз." Т.е. вы сделаете автору медвежью услугу, удалив то, что нужно оставить и оставив то, что нужно удалить.
А вот то, что вы озвучили "все не-буквы и не-цифры", записывается так:
\W

К слову отрицательный класс, записывается вот так
[^<>]

И если вы так хотите его применить (зачем если есть соответствующий класс?), то запись будет выглядеть так:
'/[^<\w>]+/'


Так что все таки доки нужно читать далеко не мне...
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Apay
Apay
сообщение 27.8.2010, 8:22; Ответить: Apay
Сообщение #8


с \\d - да, наверное лишнее, но не помешает :)

'/[^<\w>]+/' - содержит не только буквы и цифры, но и знаки <>

не надо путать '#^[\\w]+#' и '#[^\\w]+#' - как говорится найдите отличия,
к слову '#[^\\w]+#' и '#\\W+#' - одно и то же

простой результат маленького тестика:
ваше решение
[php]preg_match('\w+', '12345@#$qwer<t_fgs>fsf%^$%^$%', $result );
print_r( $result );[/php]
Warning: preg_match(): Delimiter must not be alphanumeric or backslash in ~/a.php on line 3
ставим упущенные символы
[php]preg_match('#\w+#', '12345@#$qwer<t_fgs>fsf%^$%^$%', $result );
print_r( $result );[/php]
Array( [0] => 12345 )
неверно!

теперь мой вариант, так не понравившийся вам
[php]echo preg_replace( '#[^\\w\\d]+#', '', '12345@#$qwer<t_fgs>fsf%^$%^$%' );[/php]
12345qwert_fgsfsf
все верно

ставим ваш вариант рег.выражения
[php]echo preg_replace( '/[^<\w>]+/', '', '12345@#$qwer<t_fgs>fsf%^$%^$%' );[/php]
12345qwer[COLOR=Red]<[/COLOR]t_fgs[COLOR=Red]>[/COLOR]fsf
большой опс

так кому нужно доки читать? ответ ясен.

один совет на будущее: прежде чем что-то утверждать, протестируйте хотя бы, если знаний не хватает, сможете избежать проблем (форум тут нипричем)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
Mulder_hb
сообщение 27.8.2010, 10:02; Ответить: Mulder_hb
Сообщение #9


(Apay @ 27.8.2010, 11:22) *
с \\d - да, наверное лишнее, но не помешает

Ну да, дважды проходиться по строке с одним и тем же шаблоном. Может давайте перечислим все классы, которые подходят под понятие "все буквы и цифры". Не помешает? Конечно не помешает, особенно вам спасибо скажут те несколько десятков тысяч уников, которые будут посещать ваш сайт и наслаждаться тем, как все висит и тормозит.
(Apay @ 27.8.2010, 11:22) *
'/[^<\w>]+/' - содержит не только буквы и цифры, но и знаки <>

Тут сглупил. Не тот пример взял из документации. Отрицательный класс записан верно. НО!. Это же классический говнокод. Мало того, что масло масленое вы прикрываете туфтой о том, что и так работает (у Попова тоже все работает), так еще и используйте отрицательный класс там, где он попросту не уместен.
Автор что просил? Избавить его от километрового регэкспа. А вы ему его предлагаете оставить.
Итак, у меня одна ошибка, обнаруживаемая на стадии разработки:

preg_match_all('/\w+/s', $subject, $result);

У вас две фундаментальных ошибки, обнаруживаемые только при прочтении гневных писем ваших потенциальных клиентов и приглашения кодера со стороны, потому что тот, кто пишет подобный код не может понять, где слабое звено в цепи. Вместо

$dest = preg_replace( '#[^\\w\\d]+#', '', $source );

Надо и не просто надо, а необходимо писать:

$dest = preg_replace( '/\W+/', '', $source );

Я думаю, ошибку лучше обнаружить на стадии разработки, чем на стадии промышленного использования?

А документацию я читаю всегда, когда нет возможности на месте проверить свой код. А вот вы, когда вам явно указывают на ошибки, продолжаете затыкать уши и закрывать глаза.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Apay
Apay
сообщение 27.8.2010, 10:22; Ответить: Apay
Сообщение #10


у меня не ошибка (все работает)
'12345@#$qwer<t_fgs>fsf%^$%^$%' => '12345qwert_fgsfsf'
а у вас ошибка (выдает не то что требуется)
'12345@#$qwer<t_fgs>fsf%^$%^$%' => [COLOR=Red]'12345'[/COLOR]
это то что имеем в сухом остатке, остальное - холивары

кстати, я всегда использую констркуции типа '#[^\\w]+#' вместо '#\\W+#' потомучто требуется исключать, и в первое очень просто дописать что еще нужно исключить, хотя это дело привычки

(Mulder_hb @ 27.8.2010, 13:02) *
Это же классический говнокод. Мало того, что масло масленое вы прикрываете туфтой о том, что и так работает (у Попова тоже все работает), так еще и используйте отрицательный класс там, где он попросту не уместен.
говнокод - это то что не работает (ваше), и прикрывать ее всякой туфтой - нехорошо. а у попова есть места логически неверные (неработающие)

(Mulder_hb @ 27.8.2010, 13:02) *
Я думаю, ошибку лучше обнаружить на стадии разработки, чем на стадии промышленного использования?
какую ошибку? где? укажите ее. все ведь работает
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Яндекс грохнул под фильтр совершенно нормальный сайт
6 OldSpice 4248 19.10.2017, 12:58
автор: Mukis
Открытая тема (нет новых ответов) ModX фильтр Ditto
7 iodjin 2489 2.3.2017, 14:56
автор: mmkulikov
Открытая тема (нет новых ответов) Тема имеет прикрепленные файлыФильтр за партнерки
2 Ирина 55 1799 2.10.2016, 23:45
автор: Ирина 55
Открытая тема (нет новых ответов) CNScoin - мошенники и кидалы! Чёрная ПП за которую получите фильтр!
0 Adriano_123 2323 24.7.2016, 14:36
автор: Adriano_123
Открытая тема (нет новых ответов) Фильтр без БД
17 fisherokspb 8597 20.1.2014, 18:37
автор: -HTMLandPHP-


 



RSS Текстовая версия Сейчас: 26.4.2024, 1:01
Дизайн