PHP « preg replace и жестко заданное количество символов

Здравствуйте.

Есть следующее выражение:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .php.geshi_code {font-family:monospace;} .php.geshi_code .imp {font-weight: bold; color: red;} .php.geshi_code .kw1 {color: #b1b100;} .php.geshi_code .kw2 {color: #000000; font-weight: bold;} .php.geshi_code .kw3 {color: #990000;} .php.geshi_code .co1 {color: #666666; font-style: italic;} .php.geshi_code .co2 {color: #666666; font-style: italic;} .php.geshi_code .co3 {color: #0000cc; font-style: italic;} .php.geshi_code .co4 {color: #009933; font-style: italic;} .php.geshi_code .coMULTI {color: #666666; font-style: italic;} .php.geshi_code .es0 {color: #000099; font-weight: bold;} .php.geshi_code .es1 {color: #000099; font-weight: bold;} .php.geshi_code .es2 {color: #660099; font-weight: bold;} .php.geshi_code .es3 {color: #660099; font-weight: bold;} .php.geshi_code .es4 {color: #006699; font-weight: bold;} .php.geshi_code .es5 {color: #006699; font-weight: bold; font-style: italic;} .php.geshi_code .es6 {color: #009933; font-weight: bold;} .php.geshi_code .es_h {color: #000099; font-weight: bold;} .php.geshi_code .br0 {color: #009900;} .php.geshi_code .sy0 {color: #339933;} .php.geshi_code .sy1 {color: #000000; font-weight: bold;} .php.geshi_code .st0 {color: #0000ff;} .php.geshi_code .st_h {color: #0000ff;} .php.geshi_code .nu0 {color: #cc66cc;} .php.geshi_code .nu8 {color: #208080;} .php.geshi_code .nu12 {color: #208080;} .php.geshi_code .nu19 {color:#800080;} .php.geshi_code .me1 {color: #004000;} .php.geshi_code .me2 {color: #004000;} .php.geshi_code .re0 {color: #000088;} .php.geshi_code span.xtra { display:block; }

$pattern = '#[^d]{1,3}#';
$line = preg_replace($pattern, '', $line);
 

Строку чистит, но почему не срабатывает ограничение на число символов?

1 ответов


Потому что допустим, удаляем из строки 2345$@%!*)%23423. 2345 $@% !*)%23423 - удалит выделенное, остается 2345!*)%23423, ищем дальше совпадения 2345 !*) %23423, дальше 2345%23423, один символ тоже подходит под правило, удаляем его 2345 % 23423, остались только цифры.


Вам вообще для чего? Если для общей чистки строки, то почему тогда только 3 символа? Вообще лучше сначала заглянуть сюда http://php.net/filter_var и сюда http://www.php.net/manual/en/filter.filters.sanitize.php, а потом уже браться за регулярки.


И кстати для
> Что непонятно? Есть строка, например, "123фыва45", регулярка сейчас выдает "12345", а должна "123". Приходиться использовать substr().
Проще всего использовать приведение к целому, т.е. $var = (int) '1234фыва45'; // 1234