dongtangjie0495 2016-07-06 09:10
浏览 52
已采纳

正则表达式除了一个特定的任何字符,使用break line PHP

I would like to build a regex that grep all characters between [[xxx]], with new line.

[[dgghr]]
[[dfgdfgfd
dgfsdgdg]]

/\[\[([\s\S]+)\]\]/s

But this regex grep :

"df]]
[[df 
d
gfdg"

I would like :

"dgghr" and "dfgdfgfd
    dgfsdgdg"

I tried to exclude "]" character, without success :( Thank you for all. G.

Edit

I've just finded! Here the solution : String :

[[dgghr]]
[[dfgdfgfd
dgfsdgdg]]

Regex :

/\[\[([\s\S][^\]]+)\]\]/s

Output :

array('dgghr', 'dfgdfgfd
dgfsdgdg')

Thank you MariaDeleva and splash58 G.

  • 写回答

1条回答 默认 最新

  • dongxing4805 2016-07-06 09:18
    关注

    To exclude a character, use a negated class : [^x] matches any character but x. Since ] has a special meaning in character classes, you have to escape it : [^\]]

    Now simply excluding ] could give you undesirable results if the text bewteen double brackets can contain brackets : \[\[[^\]]*\]\] wouldn't match [[this]test]].

    I believe the only problem with your regex is that it is greedy : it will match as much as it can, rather than stopping to the first match, so the [\S\s] class will match closing brackets as long as there are others that can be matched by \]\] later.
    So what I propose is to make your [\S\s]+ part lazy/non-greedy, as in the following :

    /\[\[([\s\S]+?)\]\]/s
    

    You can try it on regex101.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 个人网站被恶意大量访问,怎么办
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制