1
moen 2022-03-30 22:34:19 +08:00 1
应当明白一个常识——正则表达式不是万能的,它不能匹配 HTML
这个需求最简单的方式是找个 HTML 解析工具得到 DOM 然后直接修改其每个 innerText |
3
oneisall8955 2022-03-31 06:26:49 +08:00 via Android
解析 dom ,看看有没有类似 jquery contains ?
|
4
BreadKiller 2022-03-31 09:54:36 +08:00
以你的需求还是建议你解析 DOM 操作比较好
|
5
kaiki OP @BreadKiller 其实实际使用场景应该只需要过滤 class 、href 、title 即可,感觉只针对这三个来做就行,但是它们得在 html 标签中才需要过滤掉。
我基本没写过正则写出来的都不行 |
6
Pipecraft 2022-03-31 16:39:13 +08:00
@kaiki #5 非 html 标签的内容,把什么替换为什么?"2" 替换为 "[2]"? 例子好像不太对。
下面是 JS 的正则,PHP 也可用。 ``` /((<[^>]+>)*[^<>]*?)(关键字)/gim 替换为 $1[$3] ``` |
7
kaiki OP @Pipecraft 试了一下没有成功,可能 PHP 里存在一些问题吧,并且 php 的 preg_replace 没有 g 。
我用 php 自己写了一个 ``` function keyword($dat,$keyword){ $len = strlen($dat); $st = -1; //开始 $ishtml = false; $html = ''; for($i = 0;$i < $len;$i++){ $s = substr($dat,$i,1);//当前字符 if(ord($s) == 60){ //< if(!$ishtml && $i > 0 && $st + 1 < $i){//在遇到 html 标签开始符号时,进行一次截断,并处理 keyword $html .= self::keyword_replace(substr($dat,$st + 1,$i - $st - 1),$keyword); } $st = $i; $ishtml = true; } if(ord($s) == 62){ //> if($st != -1){//在遇到 html 标签结束符号时,进行一次截断 $html .= substr($dat,$st,$i - $st + 1); $ishtml = false; $st = $i; } } if(!$ishtml && $i +1 == $len){//在文本的最后一个字符时,进行一次截断,并处理 keyword $html .= self::keyword_replace(substr($dat,$st + 1,$i - $st),$keyword); } } return $html; } ``` |