#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. Спасибо!