如何选择两个标签之间的所有文本-例如:页面上所有“<pre>
”标签之间的文本。
"<pre>(.*?)</pre>"
,(将pre替换为您想要的任何文本),并提取第一组(如需更具体的说明,请指定语言),但这假设您有非常简单和有效的HTML。<pre>(.*?)<\/pre>
后仍然看到<pre>
标签,那是因为你正在查看完全匹配(full match)捕获的内容,而不是(.*?)捕获组的内容。听起来有点俗套,但我总是认为“括号=一对小偷”,因为除非(
后面跟着一个?
,例如(?:
或(?>
,否则每个匹配都会有两个捕获:一个用于完全匹配(full match),一个用于捕获组。每增加一组括号就会增加一个额外的捕获组。你只需要知道如何在你所使用的语言中检索出这两个捕获组即可。 - rbsdca标签可以在另一行中完成。这就是为什么需要添加\n
的原因。
<PRE>(.|\n)*?<\/PRE>
(.|\n)*?
是一个重要的要点。所选答案仅在HTML标签在同一行上时有效。 - Caleuanhopkins(.|\n)*?
来匹配任何字符,而应该使用带有 s
(单行模式) 修饰符的 .
。或者可以使用 [\s\S]*?
来解决。 - Wiktor Stribiżew/\*(.|\n)*?\*/
这个正则表达式,它完成了工作 - 谢谢。 - wkille(?<=<pre>)(.*?)(?=</pre>)
(?<=<pre>)
查找 <pre>
后面的文本
(?=</pre>)
查找 </pre>
前面的文本
结果将会是 pre
标签内的文本。
<pre>first</pre><pre>second</pre>
- Evan Kleiner(?<=(<pre>))(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|`~]| )+?(?=(</pre>))
基本上它所做的是:
(?<=(<pre>))
选择必须以<pre>
标签开头。
(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )
这只是我想应用的一个正则表达式��在这种情况下,它选择字母、数字、换行符或方括号中列出的一些特殊字符。管道字符|
表示"或"。
+?
加号字符表示要选择以上内容中的一个或多个 - 顺序不重要。问号将默认行为从“贪婪”改为“非贪婪”。
(?=(</pre>))
选择必须以</pre>
标签结尾。
根据您的用例,您可能需要添加一些修改器,例如(i或m)
在这里,我在Sublime Text中执行了此搜索,因此不必在我的正则表达式中使用修改器。
还要查看JAVASCRIPT REGEX DOCUMENTATION了解非捕获括号
这个答案假设支持向前/向后查找!这使我能够识别出在一对开放和关闭标签之间的所有文本。也就是在'>'和'<'之间的所有文本。它有效的原因是向前/向后查找不会消耗匹配的字符。
(?<=>)([\w\s]+)(?=<\/)
我在https://regex101.com/上使用此HTML片段进行了测试。
<table>
<tr><td>Cell 1</td><td>Cell 2</td><td>Cell 3</td></tr>
<tr><td>Cell 4</td><td>Cell 5</td><td>Cell 6</td></tr>
</table>
这是一个由三部分组成的游戏:回顾过去、内容本身和展望未来。
(?<=>) # look behind (but don't consume/capture) for a '>'
([\w\s]+) # capture/consume any combination of alpha/numeric/whitespace
(?=<\/) # look ahead (but don't consume/capture) for a '</'
我希望这可以作为一个好的起点,祝你好运。myString.match(/(?<=>)([\w\s\-\!@#$%^&*()_+|~=
{}[]:";'?,./]+)(?=</)/gm);`。这将返回一个包含所有匹配项的数组,包括几乎所有可用的特殊字符。 - Raphael Setin[tag]
替换为您希望从中提取内容的实际元素。<[tag]>(.+?)</[tag]>
有时标签会带有属性,比如锚标签(anchor
)的href
, 然后使用下面的模式。
<[tag][^>]*>(.+?)</[tag]>
<[tag]>
将匹配<t>
,<a>
和<g>
。 - Martin Schneider[]
应该完全省略掉才更清晰,因为它们在正则表达式中有特殊含义,并且人们通常会先浏览代码再阅读文本 ;) - Martin Schneider这似乎是我发现的所有最简单的正则表达式
(?:<TAG>)([\s\S]*)(?:<\/TAG>)
(?:<TAG>)
([\s\S]*)
包括在匹配结果中(?:<\/TAG>)
style[lang="scss"]
的innerHTML,而这个链接帮了我大忙:https://regex101.com/r/VqhNsI/1。 - Cody简单来说,HTML不是一个正则语言,因此您无法完全使用正则表达式解析它。
尽管如此,当没有类似标签嵌套时,您可以解析HTML的子集。所以只要在<tag>
和</tag>
之间的任何内容不是该标签本身,这种方法就可行:
preg_match("/<([\w]+)[^>]*>(.*?)<\/\1>/", $subject, $matches);
$matches = array ( [0] => full matched string [1] => tag name [2] => tag content )
$obj = new DOMDocument();
$obj -> load($html);
$obj -> getElementByTagName('el');
$value = $obj -> nodeValue();
由于这是一个适当的解析器,因此它将能够处理嵌套标记等。
试试这个....
(?<=\<any_tag\>)(\s*.*\s*)(?=\<\/any_tag\>)
(?<=>)[^<]+
对于Notepad++
>([^<]+)
(?=>([^<]+))
/<div>.*?<\/div>/.exec("<div><div></div></div>")
- jdh8