正则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,如( i或m ) i – 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>