掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 926|回复: 25

[求助] 正则表达式替换问题:如何给HTML正文斜杠加上标签

[复制链接]
  • TA的每日心情
    慵懒
    2021-9-28 14:33
  • 签到天数: 158 天

    [LV.7]常住居民III

    发表于 2019-1-16 16:00:34 | 显示全部楼层 |阅读模式
    本帖最后由 atauzki 于 2019-1-16 19:03 编辑 ( C5 f. _# @7 N, Z  P" P

    4 f3 F  e5 t# P. I+ B/ r6 f" c* \2 \如何将类似
    1. <script type="text/javascript"></script><span class="foo">a foo/bar/baz/...<a href="entry://localhost/vbiauedbvie0">aaa/bbb/ccc/ddd</a>ee/fff/gg</span>
    复制代码

    # ?9 z, \8 p6 d7 c$ x/ \- {+ w1 q& H$ {这类字符串替换成
    1. <script type="text/javascript"></script><span class="foo">a foo<span class="sep">/</span>bar<span class="sep">/</span>baz<span class="sep">/</span>...<a href="entry://localhost/vbiauedbvie0">aaa<span class="sep">/</span>bbb<span class="sep">/</span>ccc<span class="sep">/</span>ddd</a>ee<span class="sep">/</span>fff<span class="sep">/</span>gg</span>
    复制代码

    & u3 {4 [/ V7 y) y要替换的文本中标签可能存在url,嵌套任意,正文内容中单词数量可变。现在要求保持标签内部斜杠不变,正文里斜杠被<span class="sep">标签包围。3 x- t" o5 U) c3 t5 P
  • TA的每日心情
    慵懒
    2021-9-28 14:33
  • 签到天数: 158 天

    [LV.7]常住居民III

     楼主| 发表于 2019-1-17 10:59:38 | 显示全部楼层
    本帖最后由 atauzki 于 2019-1-17 13:51 编辑 * A, f/ c: v) M' ^( M8 P
    jonah_w 发表于 2019-1-16 23:32
    , \/ q+ d) [* x0 i4 L# g可能编辑器对正则的支持不尽相同,我这边是可以的。

    * f* d% q4 T4 v! _3 c; F确实如此。安卓quickedit测试成功。这个编辑器的正则引擎就是java的自带正则库,emeditor默认用的boost7 o- l, z4 ~. _# ~
    UPADTE:(?<=>)([^<>]+?)(\/)([^<>]+?)(?=<)可以替换。转义符不能随便用。
    : j+ ]8 K& K, b- Y7 K

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x
  • TA的每日心情
    慵懒
    2019-1-23 10:04
  • 签到天数: 122 天

    [LV.7]常住居民III

    发表于 2019-1-16 18:08:21 | 显示全部楼层
    可以先缩小至需要替换的范围,然后在选中范围内进一步作替换。- P) }) f( N2 e4 V' k( V( Z

    7 u) k6 `* [; j' H: J/ v3 w7 N8 c: kEmEditor里可以这么做:8 r  s5 e8 Q) v
    <a href="..."></a>内的斜杠
    9 c- X+ g3 U- E; {) f6 F1. 查找全部:1 m5 |  n3 I# V; @: L
    1. (?<=">)([^<]*?)(?=</a>)
    复制代码
    2. 勾选仅限于选区内 (in the selection only),再将"/"替换成"<span class="sep">/</span>"6 H$ s+ K  ?5 Y& a

    : c1 P+ F* q0 c' A4 m2 d* E1 n- W5 m5 I% x' U9 C" i& W
    紧接在<span class="foo">后面的斜杠. H7 [# P7 ?4 s- J2 Z. s) n
    1. 查找全部, }/ K+ v3 `' \1 O
    1. (?<=<span class="foo">)([^<]*?)(?=<)
    复制代码
    2. 勾选仅限于选区内 (in the selection only),再将"/"替换成"<span class="sep">/</span>"

    评分

    2

    查看全部评分

  • TA的每日心情
    开心
    2019-1-18 23:55
  • 签到天数: 230 天

    [LV.7]常住居民III

    发表于 2019-1-16 16:20:11 来自手机 | 显示全部楼层
    先替换标签内容,再换正文,最后把标签内容恢复回去,应该可以
  • TA的每日心情
    擦汗
    2019-12-4 09:00
  • 签到天数: 302 天

    [LV.8]以坛为家I

    发表于 2019-1-16 16:44:34 | 显示全部楼层
    你敢保证所有形式都这样吗?如果是的话,不就是把“/”替换成了“<span class="sep">/</span>”吗 正常替换不就行了吗
  • TA的每日心情
    慵懒
    2021-9-28 14:33
  • 签到天数: 158 天

    [LV.7]常住居民III

     楼主| 发表于 2019-1-16 16:51:40 | 显示全部楼层
    dothu 发表于 2019-1-16 16:44* \4 I: s1 s0 L/ W% e" \
    你敢保证所有形式都这样吗?如果是的话,不就是把“/”替换成了“/”吗 正常替换不就行了吗 ...
    ! D' b: `2 R% F) u- G
    要排除掉html标签内的斜杠,以及<a href=...>的斜杠
  • TA的每日心情
    擦汗
    2019-12-4 09:00
  • 签到天数: 302 天

    [LV.8]以坛为家I

    发表于 2019-1-16 17:15:53 | 显示全部楼层
    不用管标签内的斜杠,[^>]就连同斜杠一起排除了
    1 `2 W. d+ Q6 B3 ~4 ~: _8 R$ v2 p! ]" Y  K: a7 n
    查找
    % H6 o7 i0 X1 F% q+ P2 j
    1. (<a href="entry://[^>]*?>\w+?)(/)(\w+?)(/)(\w+?)(/)(\w+?</a>)
    复制代码

    4 T8 e, o, S4 v4 G" ]替换* d- _, @& I3 n* h- {
    1. \1<span class="sep">\2</span>\3<span class="sep">\4</span>\5<span class="sep">\6</span>\7
    复制代码

    9 y" \1 a& t- t7 `7 z! R
  • TA的每日心情
    慵懒
    2021-9-28 14:33
  • 签到天数: 158 天

    [LV.7]常住居民III

     楼主| 发表于 2019-1-16 17:23:03 | 显示全部楼层
    dothu 发表于 2019-1-16 17:154 z# H# [6 X  d
    不用管标签内的斜杠,[^>]就连同斜杠一起排除了
    1 p6 R+ [% ~4 x2 p0 P, I/ I# W; N9 q& ?; J/ H
    查找

    * s3 y% a$ ?: x  F( F如果标签内斜杠数目有变化呢
  • TA的每日心情
    擦汗
    2019-12-4 09:00
  • 签到天数: 302 天

    [LV.8]以坛为家I

    发表于 2019-1-16 17:25:37 | 显示全部楼层
    atauzki 发表于 2019-1-16 17:23
    / S8 }9 l. A4 C/ o& ^8 e如果标签内斜杠数目有变化呢

    5 R9 O5 g- a+ _. t3 f, Q你是说标签内包含的aaa|bbb|ccc有变化是吧,对啊,所以刚才问你是不是严格准守这个格式啊
  • TA的每日心情
    慵懒
    2021-9-28 14:33
  • 签到天数: 158 天

    [LV.7]常住居民III

     楼主| 发表于 2019-1-16 17:43:57 | 显示全部楼层
    dothu 发表于 2019-1-16 17:25
    ( t" w$ `" Q/ `你是说标签内包含的aaa|bbb|ccc有变化是吧,对啊,所以刚才问你是不是严格准守这个格式啊 ...

    ! v& C# v( V; Q3 D( _& R5 X不严格遵守啊,我刚才编辑了一下1楼的问题。基本上就是最一般的情况。
  • TA的每日心情
    擦汗
    2019-12-4 09:00
  • 签到天数: 302 天

    [LV.8]以坛为家I

    发表于 2019-1-16 18:17:20 | 显示全部楼层
    atauzki 发表于 2019-1-16 17:43
    4 j6 F+ x0 [! M5 E不严格遵守啊,我刚才编辑了一下1楼的问题。基本上就是最一般的情况。
    : }9 u- |% ]+ d) p5 P8 E
    你这种情况能一次匹配,但不能替换,正则没法替换计数的匹配。只能采用多次匹配替换,或者脚本。
  • TA的每日心情
    擦汗
    2019-12-4 09:00
  • 签到天数: 302 天

    [LV.8]以坛为家I

    发表于 2019-1-16 18:20:12 | 显示全部楼层
    嗯,9楼方法简单,完全可行,我还没注意EmEditor有这么个功能,这软件果然是个好东西。。。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

    发表于 2019-1-16 19:00:58 | 显示全部楼层
    供参考:
    ! B* P' D. F3 G/ `* _  A, T* U3 R7 _) X
    1. (?<=\>)([^<>]+?)(\/)([^<>]+?)(?=<)
    复制代码

    ; |( h' D0 n' a0 u* t8 K1 S
    * V* [1 {. T, w7 Y2 d9 v替换为:
    0 W4 w3 n( _6 A$ x, J
    2 y$ R. X! [; B2 g; j6 Q! l( }% D
    1. \1<span class="sep">/</span>\3
    复制代码

    / j& _% Y) H3 N3 U" R" Y1 ?+ ]; R$ {
    注:需多次替换
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    发表于 2019-1-16 19:04:45 | 显示全部楼层
    应该一步就可以替换到位:搜索>……<之间的/替换即可,其中>……<是指以>开头,以<结尾

    评分

    1

    查看全部评分

  • TA的每日心情
    擦汗
    2019-12-4 09:00
  • 签到天数: 302 天

    [LV.8]以坛为家I

    发表于 2019-1-16 20:15:33 | 显示全部楼层
    VimVim 发表于 2019-1-16 19:04
    - X% }* j+ o4 b: \. Z+ E应该一步就可以替换到位:搜索>…………开头,以
    ; j% Z; [( c, U+ X
    这个我想过,但从我经验上看是很容易误伤。其实我3楼就是这个意思... 0_0!

    点评

    3楼的方法应该会误伤诸如此类的替换吧:<a href="entry://localhost/vbiauedbvie0">  发表于 2019-1-16 20:17
  • TA的每日心情
    擦汗
    2019-12-4 09:00
  • 签到天数: 302 天

    [LV.8]以坛为家I

    发表于 2019-1-16 20:20:18 | 显示全部楼层
    不,我的意思是你那个,> ... <, 当然不可能是纯的直接替换...

    该用户从未签到

    发表于 2019-1-16 20:24:57 | 显示全部楼层
    本帖最后由 dongzhi1980 于 2019-1-16 20:50 编辑
    3 O" Q" h$ w  m4 `6 g: A3 k
    3 q. e. i& }8 A& ^8 U- W) ^个人认为至少需要两步:(在Emeditor环境中通过)' w' \$ f4 u9 z# Y* z* Q8 G2 n
    1.ctrl+F弹出页面输入 >[^<].*?/.*?< 点击 选中所有,再在同一界面下点击 替换. i6 O8 T4 B5 C9 R9 w! k) a
    2.取消正则模式,点击 仅限选区内后输入 查找 / 替换为 <span class="sep">/</span> 再点击全部替换,收功。% v4 d( c9 u7 f* z. x
    附件为图片,详细过程
    # Y6 ^* X$ |% x基本思想是:1.选中全部非标签区域内容;2.在选中的区域中替换掉全部的/。就这样
    5 [! ~. {% P1 S" d( X$ T4 W3 ~3 `+ ^

    5 T) E4 \* b7 R" ]2 ^3 p  \6 J: R0 r$ i" l# D5 c% U

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x
  • TA的每日心情
    慵懒
    2021-9-28 14:33
  • 签到天数: 158 天

    [LV.7]常住居民III

     楼主| 发表于 2019-1-16 20:34:37 | 显示全部楼层
    jonah_w 发表于 2019-1-16 19:00, {1 V- B9 R# R6 D* H: _
    供参考:

    7 i, e. P8 ?+ y6 o1 e# @- g这个不行。最后还有残留。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x
  • TA的每日心情
    慵懒
    2021-9-28 14:33
  • 签到天数: 158 天

    [LV.7]常住居民III

     楼主| 发表于 2019-1-16 20:37:30 | 显示全部楼层
    本帖最后由 atauzki 于 2019-1-16 20:55 编辑
    " ~0 k7 ~8 m  T; D8 B4 _
    , Z$ i: V9 m' X用这个(?=>)[^<]+?(?=<)然后全选替换。
    6 ^6 E! j* P" F5 \# Z& A6 R2 v3 L1 N结果和16楼基本一样。

    该用户从未签到

    发表于 2019-1-16 20:44:54 | 显示全部楼层
    本帖最后由 dongzhi1980 于 2019-1-16 20:46 编辑 5 G! a1 O# U) G
    atauzki 发表于 2019-1-16 20:37
    2 l. y5 }; T6 m用这个(?=>)[^
    $ e4 m' C# J9 i; p
    你看懂16楼的方法了吗,再下载图片看看详细过程吧,我是调试通过了才贴出方法的
    1 P: @% Z2 Q6 Z. U' ?$ [% O
  • TA的每日心情
    慵懒
    2021-9-28 14:33
  • 签到天数: 158 天

    [LV.7]常住居民III

     楼主| 发表于 2019-1-16 20:54:25 | 显示全部楼层
    本帖最后由 atauzki 于 2019-1-16 21:01 编辑 + w* `" L; K  z" p; v) ], m. t; T
    dongzhi1980 发表于 2019-1-16 20:44! u+ m' h5 r. ?6 b0 ~+ K" \" y  C
    你看懂16楼的方法了吗,再下载图片看看详细过程吧,我是调试通过了才贴出方法的
    ' a, O- k/ S# s) t+ q& M0 v/ H  M ...
    / A0 _2 l# {" y, a1 D
    测试过了。详细过程不一样,我还是明白的。第二步我就不贴了。: d( L; U& W. Q- |$ q

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x

    该用户从未签到

    发表于 2019-1-16 21:03:02 | 显示全部楼层
    本帖最后由 dongzhi1980 于 2019-1-17 10:31 编辑 ) e9 l: a8 S. N0 u/ D! z
    atauzki 发表于 2019-1-16 20:54
    8 I. p/ o* S: _7 K! x测试过了。详细过程不一样,我还是明白的。
    ' P" S8 A  N) ?
    仔细想一想,第一步用正则可以成功选中非标签区域的所有内容(包括“/”),然后第二步用正常方法(非正则)对选中的内容中的“/”进行替换,怎么能不成功。
    ' }: t' N4 @. \! ~! W' U' U$ N3 t  c, ]3 t0 h
    看了你的图片,可能是我没说清楚,第一步的目的是选中全部非标签区域,你做对了,然后选中目标后点击 “同一对话框”中的替换(就在那对话框下面),就会自动切换到“替换”对话框,然后在替换对话框中按我的图片2中的进行操作就行了(注意“取消正则”并点击“仅选中的内容”这两项)。
    3 ]# u0 K% \8 f- m0 O' `下面这个附件中是我录制的视频操作过程,可以参考一下(EmEditor Version 18.4.0)
    0 W! n- E, ^' k
    : E3 A  ?9 b' n. \7 X; T' z7 x: @7 d3 x9 P# V) J1 B2 ~

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

    发表于 2019-1-16 23:32:58 | 显示全部楼层
    atauzki 发表于 2019-1-16 20:34
    ; J' l) y/ I/ Y* ~( }5 |  w这个不行。最后还有残留。
    - F& s8 z6 c3 c5 x
    可能编辑器对正则的支持不尽相同,我这边是可以的。
  • TA的每日心情
    擦汗
    2019-12-4 09:00
  • 签到天数: 302 天

    [LV.8]以坛为家I

    发表于 2019-1-17 10:24:34 | 显示全部楼层
    哦去,这个问题还没结束啊,建议按9楼的方法,就是借助EmEditor正则取出一部分再正则替换一次,最能减少误伤几率,还不用手动写脚本。
  • TA的每日心情
    开心
    2019-8-21 08:44
  • 签到天数: 163 天

    [LV.7]常住居民III

    发表于 2019-1-17 12:28:02 | 显示全部楼层
    >[^<]+< 不是可以完美定位?* l1 j1 r: p) {" ?, l' _
    7 Y( d" ?% R/ s8 l9 A* t
    https://regex101.com/r/MAw0Wr/1/
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2024-4-24 07:20 , Processed in 0.062296 second(s), 10 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

    快速回复 返回顶部 返回列表