Что не так с preg_replace?

#php #regex #preg-replace

#php #регулярное выражение #preg-заменить

Вопрос:

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

 $string = preg_replace("/[_BEGIN_](.*?)[_END_]/", '', $string);
  

Он удаляет все содержимое между любыми мета-тегами [_BEGIN_] и [_END_] . Например, применяется к:

 "The [_BEGIN_] quick brown [_END_]fox jumps over the lazy dog"
  

выдает в качестве результата:

 "The fox jumps over the lazy dog"
  

Проблема в том, что это работает на моей машине разработки (Ubuntu 9.10, PHP версии 5.2.10), но на моем производственном сайте (Gentoo 1.6.14, PHP версии 5.2.5-pl1-gentoo) происходит сбой (preg_replace возвращает ту же входную строку).

Есть какие-либо проблемы с используемым регулярным выражением? Как я могу исправить эту проблему? Как это отладить? Любая подсказка будет приветствоваться. Спасибо.

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

1. Ваше регулярное выражение кажется прекрасным. Я не знаю PHP, но я слышал, что есть различия между одинарными и двойными кавычками. Использование одинарных кавычек вокруг регулярного выражения что-нибудь меняет?

2. @TimPietzcker это отлично работает на «обычных» системах: codepad.org/1u5HEX9R

3. @Ivan попробуй создать простой preg_replace тестовый файл и посмотри, работает ли это. Вы включили ошибки и предупреждения?

4. Да, ошибок или предупреждений нет. Я выполнил простой тест (фрагмент кода, подобный кодовому блоку @TimPietzcker, и он не воспроизводится. Я воспроизвожу это только в середине сотен строк кода:-O

Ответ №1:

Я не вижу C нигде в списке escape-последовательностей. Разве это не должно быть (.*?) вместо (C*?) ?

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

1. Согласен, я никогда не слышал о C . Я бы выбрал /[_BEGIN_](.*?)[_END_]/ . Может быть, C это что-то специфичное для платформы?

2. Я проверил это, но безуспешно. Я отредактировал вопрос, чтобы указать, что проблема не в этом. В любом случае, спасибо.

Ответ №2:

C это то же самое, что:

 [^-._:A-Za-z0-9]
  

Попробуйте изменить его на this, поскольку не все варианты поддерживают C

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

1. Интересно! У вас есть ссылка, содержащая это? Не могу найти его здесь: php.net/manual/en/regexp.reference.escape.php 🙁

2. Проблема не в этом. Я дважды проверил это и обнаружил то же самое поведение. Я отредактировал вопрос, чтобы отметить, что проблема не в этом. Спасибо.

3. @Marcus Ах, так это не зависит от PHP в некоторых версиях, а является общей частью некоторых реализаций регулярных выражений, таких как в .NET. Спасибо!