正则表达式-过滤富文本图片

两年前专门学过正则表达式的基本用法,之后很少用到,现在已经忘的差不多了。现在重新学习并记录,便于查看。记忆力不好,不常用的东西从来都是记不住的。

一、正则表达式的基本用法

语法:/正则表达式主体/修饰符(可选)
实例:var pattern = /helloworld/i;

1.修饰符
  • i 执行对大小写不敏感的匹配
  • g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)
  • m 执行多行匹配
2.方括号
  • [abc]查找方括号之间的任何字符
  • [^abc]查找任何不在方括号之间的字符
  • [0-9]查找任何从 0 至 9 的数字
  • [a-z]查找任何从小写 a 到小写 z 的字符
  • [A-Z]查找任何从大写 A 到大写 Z 的字符
  • [A-z]查找任何从大写 A 到小写 z 的字符
  • (x|y)查找任何以 | 分隔的选项
3.元字符
  • .查找单个字符,除了换行和行结束符
  • \w查找单词字符
  • \W查找非单词字符
  • \d查找数字
  • \D查找非数字
  • \s查找空白字符
  • \S查找非空白字符
  • \n查找换行符
  • \b匹配单词边界
  • \B匹配非单词边界
4.量词
  • n+匹配任何包含至少一个 n 的字符串
  • n*匹配任何包含零个或多个 n 的字符串
  • n?匹配任何包含零个或一个 n 的字符串
  • ^n匹配任何开头为 n 的字符串
  • n$匹配任何结尾为 n 的字符串
  • ?=n匹配任何其后紧接指定字符串 n 的字符串
5.常用方法
  • search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。
let str = 'Hello World';
//指定字符串搜索
str.search('World'); //6
//匹配正则表达式搜索
str.search(/World/); //6
//匹配正则表达式搜索,区分大小写
str.search(/world/); //-1
//匹配正则表达式搜索,不区分大小写
str.search(/world/i); //6
  • replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
let str = 'Hello World';
//替换指定字符串
str.replace('World', 'Apple'); //Hello Apple
//替换与正则表达式匹配的子串
str.replace(/World/, 'Apple'); //Hello Apple
//替换与正则表达式匹配的子串,区分大小写
str.replace(/world/, 'Apple'); //Hello World
//替换与正则表达式匹配的子串,不区分大小写
str.replace(/world/i, 'Apple'); //Hello Apple
  • match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g。如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。
let str = 'Hello World';
str.match(/World/); //["World", index: 6, input: "Hello World", groups: undefined]
str.match(/\b[A-z]+\b/); //["Hello", index: 0, input: "Hello World", groups: undefined]
str.match(/\b[A-z]+\b/g); //["Hello", "World"]
  • test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。
let str = 'Hello World';
let pattern = /World/;
pattern.test(str); //true
也可以直接这么写:/World/.test('Hello World')
  • exec() 方法用于检索字符串中的正则表达式的匹配。该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
let str = 'Hello World';
let pattern = /World/;
pattern.exec(str); //["World", index: 6, input: "Hello World", groups: undefined]

以上列出的都比较常见,如果要了解更详细的信息,可以访问 w3school 的JavaScript RegExp参考手册或者菜鸟教程的正则表达式教程

二、项目中常用到的一些正则表达式

项目中常用的正则表达式都比较简单,可以自己写,也可以在网上找,例如菜鸟教程的正则表达式在线测试,编程狮的正则表达式在线生成工具,再或者 github 上 start 数比较高的一些正则表达式随记等等。网上资源实在太多,就不一一列举了。

三、过滤富文本图片

在这里记录一个比较具体的例子,有时候会碰到这样的需求,页面里边显示富文本,富文本里边可能包含图片、音频或者视频,为了让页面内容显示的统一美观,可能需要把图片等的过滤一下,先替换成统一的图标,然后点击图标查看具体内容。真实效果如下图所示:
过滤富文本图片.jpg

以下代码比较简单,只处理了过滤图片的逻辑,过滤音频和视频都是类似的,具体还得看项目需求。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
    <style>
      img {
        width: 200px;
      }
      .img-icon {
        width: 20px;
        vertical-align: sub;
        cursor: pointer;
      }
    </style>
</head>
<body>
  <div id="box">
    <span>第一张图片</span>
    <img src="https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3383755366,4243257849&fm=26&gp=0.jpg" />,
    <span>第二张图片</span>
    <img src="http://img1.imgtn.bdimg.com/it/u=1663134360,1286341285&fm=26&gp=0.jpg" />
  </div>
  <h3>过滤图片显示为小图标:</h3>
  <div id="newBox"></div>

  <script>
    function handleRichHtmlImg(html) {
      let replacedHtml = html.replace(/<?img[^>]*?>/g, str => {
        const matchArr = str.match(/src="(.*?)"/) || [];
        let imgSrc = matchArr[1] || '';
        //这里替换显示的内容根据需求而定
        let defaultImg = '<img class="img-icon" src="https://ae01.alicdn.com/kf/H9a480ccb053d43ff89ed22a89982337dB.png" data-img-src=' + imgSrc + ' />';
        str = str.replace(/<(img).*?>/g, defaultImg);
        return str;
      })
      return replacedHtml;
    }

    var box = document.getElementById('box');
    var newBox = document.getElementById('newBox');
    var html = handleRichHtmlImg(box.innerHTML);
    newBox.innerHTML = html;
    newBox.onclick = function handleImgClick(e) {
      console.log('e', e);
      console.log('e.target', e.target);
      console.log('当前图片的真实地址', e.target.getAttribute('data-img-src'));
      //todo...比如弹框显示放大图片等操作
    }
  </script>
</body>
</html>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容

  • 正则表达式到底是什么东西?字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等...
    狮子挽歌阅读 2,145评论 0 9
  • 本文译自 制作正则引擎的作者 Jan Goyvaerts 为工具 RegexBuddy 写的教程版权归原作者所有注...
    极客圈阅读 3,284评论 0 25
  • 注:本篇文章只为方便查看,特此保留,如有冒犯,敬请谅解!!! 本文目标 30分钟内让你明白正则表达式是什么,并对它...
    阿杰Alex阅读 1,483评论 0 10
  • 忘了从哪收集的资料了,放这儿,以备不时之需。 只能输入数字:"^[0-9]*$"。 只能输入n位的数字:"^\d{...
    study_monkey阅读 1,402评论 0 7
  • 我提笔写下你眉眼 过往与今一字情牵 任他再多恩爱缠绵 也不过是终究不见 我提笔写下你眉眼 过往与今一字情牵 公子自...
    清河玖氏守墓人_玖寒鸢阅读 212评论 0 0