Проблема с регулярным выражением в PHP

#php #regex

#php #регулярное выражение

Вопрос:

Я хотел бы использовать следующее регулярное выражение в PHP для замены всех повторений символа в начале строки:

 ^.{3,5000}
  

Если я использую

 echo preg_replace('#^.{3,5000}#i', '', '------This is a test.');
  

отобразит текст «——Это тест». хотя само регулярное выражение отлично работает в любом тестере регулярных выражений.

Пока, Кристиан

Комментарии:

1. Почему вы добавили эту обратную косую черту перед кареткой? Теперь оно соответствует литералу ^ , а не начальной позиции строки, как вы хотели.

Ответ №1:

Попробуйте это вместо:

 <?php
echo preg_replace('#^(.)1{3,5000}#', '', '------This is a test.');
?>
  

который выведет:

 This is a test.
  

как вы можете видеть на Ideone.

Обратите внимание, что в круглых скобках вокруг . хранится все, что соответствует группе 1. Затем эта группа 1 повторяется от 3 до 5000 раз. Таким образом, в общей сложности оно соответствует минимум 4 повторяющимся символам. Если вы хотите сопоставить по крайней мере 3 повторяющихся символа (и произвольное количество после этого), вы могли бы сделать что-то вроде этого:

 '#^(.)1{2,}#'
  

(опустив второе целое значение в {2,} , вы получите любую сумму. Короче говоря, {2,} означает: «два или более»)

Ответ №2:

Вы избежали ^ ! Измените его на ^.{3,5000} , и оно должно сработать.

Комментарии:

1. Но это просто заменило бы от 3 до 5000 символов (за исключением разрывов строк) после начала строки, а не только повторяющиеся.

2. Извините, он сказал, что это работает в тестерах регулярных выражений в первом сообщении, поэтому я не подумал: P

3. :), да, ^ это подозрительно, хотя механизм регулярных выражений не выдает никакого сообщения об ошибке (что, вероятно, и подразумевал OP под тем фактом, что «это работает»).

4. @Bart: это не подозрительно, это просто неправильно. Это совершенно нормальная escape-последовательность для литерала ^ , что, очевидно, не то, чего хочет OP.