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

2020-02-21 00:01:53 +08:00
 SomeBottle

最近在重写博客的模板系统,然后就给写爆了,还找不到原因,这里是 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 这里就停了...有什么处理方法?

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

```

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

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

https://pastebin.com/C9hbKXby

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

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

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

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

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

你把 document.getElementsByTagName('html')[0].innerHTML 输出到控制台,看看浏览器帮你改成什么样了。
SomeBottle
2020-02-21 08:39:57 +08:00
@sneezry #6 感谢提示,我用转义解决了^_^

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/646239

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX