V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
SomeBottle
V2EX  ›  JavaScript

请教一个正则上出现的很奇怪的问题

  •  
  •   SomeBottle · 2020-02-21 00:01:53 +08:00 · 2681 次点击
    这是一个创建于 1741 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在重写博客的模板系统,然后就给写爆了,还找不到原因,这里是 html 部分:
    https://pastebin.com/YJyu6QZx
    我想获得{(PostContent)}和{(PostContentEnd)}之间的内容,首先用了不动脑子的 split 方法,结果截到 html 中的"2019-06-09 这个地方就停了,顿时就惊讶了,改模板系统之前没出过这种问题。随后我换成了正则匹配:

    xxx.match(/\{\(PostContent\)\}(.*?){\(PostContentEnd\)\}/)
    

    然而 match 出来的还是到 2019-06-09 这里就没了...
    因为要实现压缩,发布博文时我替换段落的所有空格、换行符等为{{s}},{{rn}},{{n}},我想着可能是这个影响了。随后用没有这种替换符的去匹配就成功了... 但是按理来说这一类字符不会对正则造成影响吧,为何截到 06-09 这里就停了...有什么处理方法?

    7 条回复    2020-02-21 08:39:57 +08:00
    ochatokori
        1
    ochatokori  
       2020-02-21 00:05:34 +08:00 via Android
    没仔细看你的题目
    会不会是正则没有加 g /xxx/g
    SomeBottle
        2
    SomeBottle  
    OP
       2020-02-21 00:08:57 +08:00
    @ochatokori #1 加 g 的话好似没法匹配,主要问题是匹配了,但是匹配出来的东西少了一小节
    ochatokori
        3
    ochatokori  
       2020-02-21 00:13:40 +08:00 via Android
    @SomeBottle #2 我试了一下可以成功匹配出来
    ```
    `文本`.match(/\{\(PostContent\)\}(.*?){\(PostContentEnd\)\}/)

    ```

    贴合代码?
    ochatokori
        4
    ochatokori  
       2020-02-21 00:19:25 +08:00 via Android
    @SomeBottle …,原来你自己题目都说了删了换行符号就好了

    .小数点是匹配除换行符以外的字符,所以其实去掉换行符就好了
    或者 /((.|\n)*?)/
    SomeBottle
        5
    SomeBottle  
    OP
       2020-02-21 00:22:19 +08:00
    @ochatokori #3 我抽出来了一段,底下用的是自己简单写的函数

    https://pastebin.com/C9hbKXby

    这个匹配就有问题
    sneezry
        6
    sneezry  
       2020-02-21 01:48:30 +08:00   ❤️ 1
    你的 HTML 里这样写:

    <div{{s}}class="info">

    那么它就不是 div 标签了,它也无法和</div>配对。

    浏览器认为你这个 HTML 写错了,自动帮你重新构造了 XML 树,你通过审查元素就能看到:

    https://image.sneezry.com/cauici3e4k5w.png

    你把 document.getElementsByTagName('html')[0].innerHTML 输出到控制台,看看浏览器帮你改成什么样了。
    SomeBottle
        7
    SomeBottle  
    OP
       2020-02-21 08:39:57 +08:00
    @sneezry #6 感谢提示,我用转义解决了^_^
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3997 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:58 · PVG 08:58 · LAX 16:58 · JFK 19:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.