Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Удалить всё кроме..


Автор: Gold Dragon 28.3.2011, 17:55
Помогите написать регулярку. Мне нужно удалить из строки всё кроме определённого набора символов. Символы в основном кириллица и utf-8.

Автор: skyboy 28.3.2011, 18:12
Код

// удалить все символы, кроме цифр и точки
$text = preg_replace('[^0-9.]', '', $text);

Автор: Gold Dragon 28.3.2011, 18:22
тогда я ничего не понимаю... у меня что-то такое
Код

$str = "klsaj lsa lkjsa klk jkjkkjkлоддлолдо д дод";
$str = strip_tags(trim($str));
$str = preg_replace('[^абвгдеёжзийклмнопрстуфхцчшщъыьэюя -АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ]', '', $str);
echo $str;

и не работает :(

Добавлено через 3 минуты и 52 секунды
если что, то весь проект в кодировке utf-8

Автор: bars80080 28.3.2011, 18:58
Код

 preg_replace('[^А-Яа-яЁё \-]u', '', $str);

Автор: Gold Dragon 28.3.2011, 19:03
bars80080, ну это понятно что можно сократить... Но не работает... зараз...

Автор: ksnk 28.3.2011, 19:09
Код

preg_replace('/[^А-Яа-яЁё \-]/u', '', $str);

?

Автор: Gold Dragon 28.3.2011, 19:24
ну наконец-то заработало smile Спасибо...

ksnk, а поясни все эти слеши

Автор: bars80080 28.3.2011, 19:40
Цитата(Gold Dragon @  28.3.2011,  18:24 Найти цитируемый пост)

ksnk, а 

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

Автор: Gold Dragon 28.3.2011, 20:07
так, теперь чтобы до конца самому разобраться (может когда-нибудь научусь составлять регулярки smile )

- всё выражение помещается в ограничители /
- в квадратных скобках мы перечисляем набор символов
- через тире прописываем последовательности
- обратным слэшем экранируем тире которое тоже будет в наборе и которе воспринимается как спецсимвол.
- впереди галка означает отрицание...
- после ограничителей ставим модификатор, который говорит что строки в кодировке utf-8

Так?

Автор: ksnk 28.3.2011, 20:14
Цитата(Gold Dragon @  28.3.2011,  20:07 Найти цитируемый пост)
- всё выражение помещается в ограничители /

нет. первый встретившийся символ является ограничителем (хм... м.б. непробельный?). Хотя для некоторых языков (JavaScript) - только прямой слеш.

Остальное, в основном, верно.  smile 

Автор: Gold Dragon 28.3.2011, 20:18
т.е. если я ставлю / то понимается то [ является ограничителем? Или как?
и тогда в конце /u просто говорит что это модификатор?

Автор: ksnk 28.3.2011, 20:30
Код

preg_replace('/[^А-Яа-яЁё \-]/u', '', $str);
preg_replace('#[^А-Яа-яЁё \-]#u', '', $str);
preg_replace('~[^А-Яа-яЁё \-]~u', '', $str);

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

Автор: Gold Dragon 28.3.2011, 20:38
во!!! теперь стало понятно наконец-то.. ещё раз спасибо

Автор: skyboy 28.3.2011, 20:56
поспешл - людей насмешил :(

Автор: Gold Dragon 29.3.2011, 08:03
а ещё маленький вопросик по теме... вот после всего этого у меня остаются только то что мне нужно и в том числе пробелы. Возможно ли в этом правиле предусмотреть чтобы последовательность пробелов преобразовывалась в один?

Автор: ksnk 29.3.2011, 08:39
в этом - нельзя. Можно в следующем.
Код

preg_replace('/\s\s+/',' ',$str);


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

Автор: Gold Dragon 29.3.2011, 08:46
спасибо, почему-то я так и подумал

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)