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

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

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

5628 次点击
所在节点    PHP
29 条回复
blahgeek
2017-09-04 23:06:40 +08:00
正则的表达能力应该无法完全表达 HTML 语法 总能找到 failure case
dante3imin
2017-09-04 23:16:44 +08:00
@blahgeek 额~有什么其他方案么
shiny
2017-09-04 23:19:50 +08:00
phpQuery
bombless
2017-09-05 02:38:52 +08:00
拟个 bnf 写个简单的递归下降吧哈哈哈
blanu
2017-09-05 04:15:07 +08:00
我只知道 npm 上这种轮子很多…
Perry
2017-09-05 04:33:04 +08:00
XPath
2ME
2017-09-05 08:47:36 +08:00
notolddriver
2017-09-05 09:02:05 +08:00
使用向后匹配 ?<=匹配 a 标签的全部内容,后面再跟你要替换的字符,不知可否
zgx030030
2017-09-05 09:16:11 +08:00
@notolddriver 不行,你这样也可能匹配上在 a 标签内的字符。
airycanon
2017-09-05 09:29:51 +08:00
先把带房间的 a 标签临时换成其他的唯一字符,然后全文替换房间,然后再把 a 标签还原?
wlchn
2017-09-05 10:24:06 +08:00
单就你给的测试用例,写一个正则表达式可能并不难,复杂的是需不需要更多的 case。
针对你的测试用例,使用该正则就可以,附上测试连接( Ruby )
a>[^<>]*?(?<name>房间)
测试连接: http://rubular.com/r/YFnQGTwzk2
dante3imin
2017-09-05 10:43:50 +08:00
@shiny 这个抓取倒是用过,不过我这个需求好像不太实用
dante3imin
2017-09-05 10:44:52 +08:00
@airycanon 这个方案也想过,还是觉得不太可行
notolddriver
2017-09-05 11:40:50 +08:00
可不可以多给点样本……
VgV
2017-09-05 12:28:38 +08:00
我好奇的是,已经知道具体字符串了,为何还要用正则??
str_replace 不行吗?
sola97
2017-09-05 13:16:05 +08:00
感觉 10 楼的可行
zgx030030
2017-09-05 14:12:13 +08:00
http://rubular.com/r/1dsQ7BEuzo

(?<!['"])房间(?!<\/a>)
这样虽然上面的例子是可以匹配到。。。感觉还是不够灵活啊
lieh222
2017-09-05 14:42:39 +08:00
楼主这个为啥要用正则,写个递归,先查找<a 的索引,如果没有直接替换所有,如果有替换开始到这的内容,然后找到</a>索引,取出这部分来,剩下的继续递归
gnaggnoyil
2017-09-05 14:53:49 +08:00
@lieh222 $str="<a name='</a>' href='./page.html'>foo_bar</a>"
请开始你的表演.

这种需求 LZ 如果不想找现成的轮子用的话就做好手撸一个完整的 HTML parser 的准备吧……
UnknownR
2017-09-05 15:15:52 +08:00
以前写过类似的脚本,如果楼主是想替换标签间的房间的话,可以匹配>和<字符间的任意非数字与字母,这样可以替换第二个,想替换第三个的话可以匹配"</a>"这一关键字符串三个字符长度后的任意字符

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

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

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

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

© 2021 V2EX