2010-11-15 4 views
1

У меня есть некоторый текст, я разбор, как это:PHP и preg_replace

текст. Некоторые тексты. Некоторые тексты. Некоторые текст. Некоторые тексты. Некоторые тексты. Некоторые тексты. Некоторые текст. Некоторые тексты. Некоторые тексты. Некоторые текст. Некоторые тексты. Некоторые тексты. Некоторые тексты. Некоторые текст. Некоторые тексты. Некоторые тексты. [attachment = 0] Winter.jpg [/ attachment] Некоторые текст. Некоторые тексты. Некоторые тексты. Некоторые тексты. Некоторые текст. Некоторые тексты. Некоторые тексты. Некоторые текст. Некоторые тексты. Некоторые тексты. Некоторые тексты. Некоторые текст.

Я хочу, чтобы соответствовать и удалить любой экземпляр текста, как это из строки:

[attachment=0]Winter.jpg[/attachment] 

где Winter.jpg может быть любой текст.

Однако, я получаю некоторые уведомления PHP. Я использовал regexpal.com построить это, который там работает, но использует функцию Javascript Regex:

\[attachment=.*?].*\[/attachment] 

Когда я запускаю этот код:

$pm_row['message_text'] = preg_replace('\[attachment=.*?\].*\[/attachment\]', '', $pm_row['message_text']); 

PHP жалуется с уведомлением:

[phpBB Debug] PHP Notice: in file /mail_digests.php on line 841: preg_replace() [function.preg-replace]: Delimiter must not be alphanumeric or backslash 

Таким образом, на аналогичной строке кода я разграничиваю шаблон с помощью «/»:

$post_row['post_text'] = preg_replace('/\[attachment=.*?].*\[/attachment]/', '', $post_row['post_text']); 

Но это порождает следующее:

[phpBB Debug] PHP Notice: in file /mail_digests.php on line 957: preg_replace() [function.preg-replace]: Unknown modifier 'a' 

Любые идеи о том, как это исправить?

ответ

3

Вы должны escape every occurrence of the delimiter inside the pattern:

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

Так денешься:

'/\[attachment=.*?].*\[\/attachment]/' 
        ^

Кстати: В настоящее время quantifier в .* жаден, это означает, что он будет соответствовать как можно больше. Возможно, вы захотите изменить его на неровный вариант, используя ?, как вы это делали раньше.

+1

+1 Да, это проблема.OP также должен будет сделать '. *' Ungreedy ('. *?'), Если в анализируемом тексте может быть больше одного вложения. – lonesomeday

+0

Спасибо. Регулярные выражения - это вызов! – Mark

+0

ОК, видимо, мое выражение нуждается в некоторой доработке. Как у меня есть: \t \t \t $ pm_row ['message_text'] = preg_replace ('/ \ [attachment =. *?]. *? \ [\/Attachment] /', '', $ pm_row ['message_text']) ; , но это не соответствует моей строке winter.jpg – Mark

0

Вы должны разделители, и вы должны бежать, если вы на самом деле использовать его в своем выражении (т.е .: [/attachment] имеет в нем /). Удалите его или измените разделитель (например, #).

+0

Трудно видеть, но/убегает: '/[attachment=.*?].*?[\/attachment]/'. Переход на # \ [attachment =. *?]. *? \ [\/Attachment] # не решил проблему. Спасибо за вашу помощь. – Mark

0

Я думаю, что решаю это. Мои тестовые данные в примере были плохими, поэтому я пытался сопоставить недопустимый шаблон.