【问题标题】:Extract text between paragraph tag using RegEx使用 RegEx 提取段落标签之间的文本
【发布时间】:2013-02-20 17:57:28
【问题描述】:

我尝试在 javascript 中使用 RegExp 提取段落标记之间的文本。但它不起作用......

我的模式:

<p>(.*?)</p>

主题:

<p> My content. </p> <img src="https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcTJ9ylGJ4SDyl49VGh9Q9an2vruuMip-VIIEG38DgGM3GvxEi_H"> <p> Second sentence. </p>

结果:

My content

我想要什么:

My content. Second sentence.

【问题讨论】:

  • 您可以使用正则表达式获得 &lt;p&gt; 标签的正文(尽管通常会警告您使用它进行解析),但如果您使用的是 JavaScript,则无需这样做,因为您有 document.getElementsByTagName("p") .
  • @iamnotmaynard - document.getElementsByTagName() 是一种 DOM 方法。它仅对 JavaScript 可用,因为浏览器提供了它。使用 node.js,没有浏览器,并且 node.js 本身不会将 HTML 解析为 DOM。您不能仅仅因为使用 JavaScript 语言就假设浏览器 DOM 是可用的。如果安装了这样的包,则可以使 DOM 对 node.js 可用,例如 jsdom
  • @gilly3 啊,我明白了。没有意识到这一点。
  • @gilly3,呵呵,不……又不是那么简单的通用答案-_-。对他想要的东西使用正则表达式是非常好的。

标签: javascript regex node.js express


【解决方案1】:

JavaScript 中没有“捕获所有组匹配”(类似于 PHP 的 preg_match_all),但您可以使用 .replace 作弊:

var matches = [];
html.replace(/<p>(.*?)<\/p>/g, function () {
    //arguments[0] is the entire match
    matches.push(arguments[1]);
});

【讨论】:

  • 好的,如何使用 Jade 和 NodeJS 提取

    之间的文本?
  • @tonymx227 我真的不明白你的意思.. 代码只是原始 JavaScript,所以你应该能够将它与任何 JS 解释器一起使用
  • 是的,我知道。但是使用控制器,我将所有帖子发送到我的 Jade 视图(例如),在我的视图中,我尝试获取没有标签的帖子内容... ${posts.content.match('/

    (.* ?)/g')} 但它不起作用...

  • 我不知道如何使用 Jade 视图,所以我真的无法为您提供帮助。我说使用.replace,而不是match,虽然
  • 我问了一个新问题,因为它不是同一个主题。不过还是谢谢你。
【解决方案2】:

要获得多个匹配的模式,添加全局标志 g
match 方法在全局匹配时会忽略捕获组 (),但 exec 方法不会。见MDN exec

var m,
    rex = /<p>(.*?)<\/p>/g,
    str = '<p> My content. </p> <img src="https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcTJ9ylGJ4SDyl49VGh9Q9an2vruuMip-VIIEG38DgGM3GvxEi_H"> <p> Second sentence. </p>';

while ( ( m = rex.exec( str ) ) != null ) {
    console.log( m[1] );
}

//  My content. 
//  Second sentence. 

如果段落之间可能有换行符,请使用[\s\S],意思是匹配任何空格或非空格字符,而不是.

请注意,这种正则表达式在嵌套段落上会失败,因为它会匹配第一个结束标记。

【讨论】:

  • 没有“嵌套段落”之类的东西。 &lt;p&gt; 不需要结束标签。在打开的&lt;p&gt; 标记之后出现的块元素意味着关闭&lt;/p&gt; 标记。您的正则表达式会将没有结束标签的多个段落视为一个段落。
  • @gilly3。 XHTML 需要结束标记,我认为 OP 在他的问题中非常清楚地表明他正在寻找开始和结束 p 标记之间的内容。很明显,我的答案假设结束标签,如果没有任何 OP's 正则表达式(不是我的)无论如何都不会匹配。不过,我认为您的观察是值得的,所以谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多