正则替换 ,不替换 a 标签内的字符

2017-09-04 22:46:55 +08:00
 dante3imin

$str = "<a name='房间' href='...'>房间</a>深刻的房间"; 现在需要替换除 a 标签以外的指定字符。如‘房间’两个字(只替换第三个)

5628 次点击
所在节点    PHP
29 条回复
lieh222
2017-09-05 15:20:08 +08:00
@gnaggnoyil 打脸打的好
$str="<a name='</a>aaa 房间' href='./page.html'>foo_bar</a>nnn 房间"
11、17、18 全不过
autoxbc
2017-09-05 15:38:16 +08:00
我一直觉得用正则处理 html 是有问题的

html 是结构化的数据,要想代码写的简洁有语义而健壮
先解析成结构数据,再用 XPath 和 CSS Selectors 最好

就像上面说的,强行用正则处理结构化的数据
必然不自觉的在正则里自己实现了 html parser
lzjV2EX
2017-09-05 16:52:35 +08:00
1、先使用正则替换 a 标签里面的 指定字符 成某个 标识符比如 ###。
lzjV2EX
2017-09-05 16:54:21 +08:00
@lzjV2EX 2、再把字符串里面的指定字符替换掉。
3、再把 标识符 替换成指定字符。
这样行不行?
eecjimmy
2017-09-05 18:00:52 +08:00
@lzjV2EX 思路没毛病
ZxBing0066
2017-09-05 18:13:24 +08:00
cheerio 解析 html 然后使用 jquery 查找 a 标签临近的文本节点
WheatField
2017-09-06 20:58:15 +08:00
@lieh222 但是也不会有这样的 name 属性值吧,这样的$str = "<a name='</a>aaa 房间' href='./page.html'>foo_bar</a>nnn 房间" ,浏览器也不能解析吧?
WheatField
2017-09-06 21:33:33 +08:00
@airycanon 你的想法,我觉得很赞。
支持 10 楼的方法
abccccabc
2017-09-11 15:16:29 +08:00
楼主,试下:
(?<!['"])房间(?!(<\/a>|'|"))

将 17 楼的改动下就行了,但你给的例子和发贴的例子标签不一样,所以导致 17 楼的规则不生效。

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

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

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

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

© 2021 V2EX