正则表达式的写法

通过curl抓取的文本,想通过正则匹配出取某个div的循环出现的li内的值,html结构如下:

<div class="content">
    <h1>标题xxxxx</h1>
    <div class="block-1">
        <ul class="article">
            <li>文章标题1</li>
            <li>文章标题2</li>
            <li>文章标题3</li>
        </ul>
    </div>
    <div class="block-2">
        <ul class="article">
            <li>文章标题1</li>
            <li>文章标题2</li>
            <li>文章标题3</li>
        </ul>
    </div>
    <div class="block-3">
        <ul class="article">
            <li>文章标题1</li>
            <li>文章标题2</li>
            <li>文章标题3</li>
        </ul>
    </div>
</div>

想要取class=block-2的所有li标签内的值请问应该怎么写正则

阅读 2.5k
2 个回答

image.png
可能有点取巧了,正常来说应该是匹配后置第一个</div>,不过我没成功,不知道这个对你有用没有

let str = `    <div class="block-1">
        <ul class="article">
            <li>文章标题b1</li>
            <li>文章标题b2</li>
            <li>文章标题b3</li>
        </ul>
    </div>
    <div class="block-2">
        <ul class="article">
            <li>文章标题1</li>
            <li>文章标题2</li>
            <li>文章标题3</li>
        </ul>
    </div>
    <div class="block-3">
        <ul class="article">
            <li>文章标题1</li>
            <li>文章标题2</li>
            <li>文章标题3</li>
        </ul>
    </div>`

let removeEnter = str.replace(/[\r\n]/g, "").replace(/[ ]/g, "").match(/(?<=block-1.*<li>).*?(?=<\/li>.*block-2)/g)
console.log(removeEnter)

emmmm,这是字符串的dom吗。。那也是能通过dom去处理的。我这边给出一种dom的处理方案。。
DOMParser为浏览器自带API哦,兼容性最低到IE9

const test = `<div class="content">
    <h1>标题xxxxx</h1>
    <div class="block-1">
        <ul class="article">
            <li>文章标题1</li>
            <li>文章标题2</li>
            <li>文章标题3</li>
        </ul>
    </div>
    <div class="block-2">
        <ul class="article">
            <li>文章标题1</li>
            <li>文章标题2</li>
            <li>文章标题3</li>
        </ul>
    </div>
    <div class="block-3">
        <ul class="article">
            <li>文章标题1</li>
            <li>文章标题2</li>
            <li>文章标题3</li>
        </ul>
    </div>
</div>`
const dom = new DOMParser().parseFromString(test,'text/html')
[...dom.querySelectorAll('.block-2 li')].map((v)=>v.innerText)

使用正则

const res = test.match(/<div class="block-2">(.*?)<\/div>/gs).toString().match(/(?<=<li>)(.*?)(?=<\/li>)/g)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏