#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.