【问题标题】:Matching sets of tags in PHP with Regular Expression使用正则表达式匹配 PHP 中的标签集
【发布时间】:2013-09-27 13:38:07
【问题描述】:

我目前正在保护我的 AJAX 聊天免受攻击,方法是在将 PHP 中的所有文本传递给客户端之前对其进行检查。到目前为止,我已经成功完成了我的任务,除了需要匹配图像标签集的部分。

总的来说,我希望它能够拾取我管理的一组标签之间存在换行符的任何实例,但我拥有的解决方案是贪婪的,并且如果有多个标签之外的换行符也匹配标签集。

目前,如果我只想匹配 [img]{newline}[/img],则可以使用以下方法

if(preg_match('/\[\bimg\].*\x0A.*\[\/\bimg\]/', $text)){ //code }

但是如果我想做[img]image.jpg[/img]{newline}[img]image.jpg[/img],它只会看到我不想要的第一个和结束标签。

那么现在我问,如何让它正确匹配每组标签?

编辑:澄清。标签内的任何换行符都是不好的,所以我想检测它们。标签外的任何换行符都很好,我想忽略它们。原因是,如果客户端在标签内处理换行符,它就会崩溃。

【问题讨论】:

    标签: php regex tags preg-match newline


    【解决方案1】:

    只需将? 放在两个.* 之后即可使其变得不贪心

    但请注意,您当前的解决方案与此不匹配:

    [img]
    look, two newlines!
    [/img]
    

    我不确定您为什么要这样做,但是您可以通过将 s 修饰符添加到您的正则表达式来使 . 匹配换行符。然后只需 "(\[img\](.*?)\[/img\])is" 即可匹配它,您甚至可以捕获该组并根据需要单独检查它是否有换行符。

    【讨论】:

    • 我已经尝试过放置?在 .* before 之后,它仍然匹配错误。我相信你读错了我的问题,所以我添加了说明。
    【解决方案2】:

    尝试设置 s 修饰符,如下所示:

    if (preg_match('/\[\bimg\].*\x0A.*\[\/\bimg\]/s', $text)) { code }
    

    另见PHP Documentation for Regex modifiers

    【讨论】:

    • 这似乎没有任何作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多