PHP和preg_replace

时间:2010-11-15 19:12:07

标签: php regex preg-replace

我有一些我正在解析的文字:

  

一些文字。一些文字。一些文字。一些   文本。一些文字。一些文字。一些文字。   一些文字。一些文字。一些文字。一些   文本。一些文字。一些文字。一些文字。   一些文字。一些文字。一些文字。   [附件= 0] Winter.jpg [/附着一些   文本。一些文字。一些文字。一些文字。   一些文字。一些文字。一些文字。一些   文本。一些文字。一些文字。一些文字。   一些文字。

我想从字符串中匹配并删除任何类似文本的实例:

[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 个答案:

答案 0 :(得分:3)

您需要escape every occurrence of the delimiter inside the pattern

  

如果需要在模式内匹配分隔符,则必须使用反斜杠对其进行转义。如果分隔符经常出现在模式中,最好选择另一个分隔符以提高可读性。

所以逃避它:

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

顺便说一下:目前.*中的quantifier是贪婪的,这意味着它会尽可能匹配。您可能希望使用?将其更改为不合适的变体,就像之前一样。

答案 1 :(得分:0)

你需要一个分隔符,如果你实际在你的表达中使用它,你需要逃避它(即:[/attachment]中有/。转义它或更改分隔符(例如#)。

答案 2 :(得分:0)

我想我解决了这个问题。我在示例中的测试数据很糟糕,因此我试图匹配无效模式。