正则expression式select标签之间的所有文本

select2个标签之间的所有文本的最好方法是什么 – 例如:页面上所有'pre'标签之间的文本。

你可以使用"<pre>(.*?)</pre>" (用你想要的任何文本replacepre),并提取第一组(更具体的指令指定一种语言),但是这个假设是简单的概念,非常简单和有效的HTML。

正如其他评论者所build议的,如果您正在做一些复杂的事情,请使用HTMLparsing器。

标签可以在另一行完成。 这就是为什么\n需要添加。

 <PRE>(.|\n)*?<\/PRE> 

你不应该试图parsingHTML正则expression式看到这个问题 ,以及它是如何结果。

用最简单的话来说,html不是常规的语言,所以你不能用正则expression式来完全parsing。

话虽如此,当没有嵌套类似的标签时,你可以parsinghtml的子集。 所以只要它们之间的任何东西不是标签本身,就可以工作:

 preg_match("/<([\w]+)[^>]*>(.*?)<\/\1>/", $subject, $matches); $matches = array ( [0] => full matched string [1] => tag name [2] => tag content ) 

一个更好的主意是使用一个parsing器,就像原生的DOMDocument一样,加载你的html,然后select你的标签,并得到内部的html,可能看起来像这样:

 $obj = new DOMDocument(); $obj -> load($html); $obj -> getElementByTagName('el'); $value = $obj -> nodeValue(); 

因为这是一个合适的parsing器,它将能够处理嵌套标签等。

这是我会用的。

 (?<=(<pre>))(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|`~]| )+?(?=(</pre>)) 

基本上它是做什么的:

(?<=(<pre>))select必须加上<pre>标记

(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )只是我想应用的规则expression式,在这种情况下,它会select字母或数字或换行符,或者在实例括号中select一些特殊字符。

+? 加上字符状态来select一个或多个以上的顺序并不重要。 问号将错误行为从“贪婪”改变为“不理睬”。

(?=(</pre>))select必须由<pre>标签附加

在这里输入图像描述

根据您的用例,您可能需要添加一些modyfiers,如( imi – join精确的m – 多行search。 在这里,我在Sublime Text中执行了这个search,所以我不必在我的正则expression式中使用modyfiers。

Javascript不支持向后看

上面的例子应该可以很好的使用诸如PHP,Perl,Java等语言……但Javascript不支持逆向查看,所以我们必须忘记使用(?<=(<pre>))并寻找某种解决方法。 也许简单地去掉我们的结果中的前四个字符,就像这里的Regex匹配标签之间的文本一样

另请参阅JAVASCRIPT REGEX DOCUMENTATION获取非捕获括号

尝试这个….

 (?<=\<any_tag\>)(\s*.*\s*)(?=\<\/any_tag\>) 

使用以下模式获取元素之间的内容。 将[tag]replace为您希望从中提取内容的实际元素

 <[tag]>(.+?)</[tag]> 

有时候,标签会具有像锚标签href属性,然后使用下面

  <[tag][^>]*>(.+?)</[tag]> 
 var str = "Lorem ipsum <pre>text 1</pre> Lorem ipsum <pre>text 2</pre>"; str.replace(/<pre>(.*?)<\/pre>/g, function(match, g1) { console.log(g1); }); 

对于多行:

 <htmltag>(.+)((\s)+(.+))+</htmltag> 

你可以使用Pattern pattern = Pattern.compile( "[^<'tagname'/>]" );

 <pre>([\r\n\s]*(?!<\w+.*[\/]*>).*[\r\n\s]*|\s*[\r\n\s]*)<code\s+(?:class="(\w+|\w+\s*.+)")>(((?!<\/code>)[\s\S])*)<\/code>[\r\n\s]*((?!<\w+.*[\/]*>).*|\s*)[\r\n\s]*<\/pre>