Html 正则表达式选择标记之间的所有文本
选择两个标记之间的所有文本的最佳方法是什么?例如:页面上所有“pre”标记之间的文本。您可以使用Html 正则表达式选择标记之间的所有文本,html,regex,html-parsing,Html,Regex,Html Parsing,选择两个标记之间的所有文本的最佳方法是什么?例如:页面上所有“pre”标记之间的文本。您可以使用“(.*?”,(将pre替换为所需的任何文本)并提取第一组(有关更具体的说明,请指定语言)但这假设了一个过于简单的概念,即您拥有非常简单有效的HTML preg_match("/<([\w]+)[^>]*>(.*?)<\/\1>/", $subject, $matches); $matches = array ( [0] => full matched string
“(.*?”
,(将pre替换为所需的任何文本)并提取第一组(有关更具体的说明,请指定语言)但这假设了一个过于简单的概念,即您拥有非常简单有效的HTML
preg_match("/<([\w]+)[^>]*>(.*?)<\/\1>/", $subject, $matches);
$matches = array ( [0] => full matched string [1] => tag name [2] => tag content )
<htmltag>(.+)((\s)+(.+))+</htmltag>
正如其他评论者所建议的那样,如果您正在做一些复杂的事情,请使用HTML解析器。您不应该尝试使用正则表达式解析HTML,请参见结果 最简单的说,html不是一种常规语言,因此无法使用正则表达式完全解析is 已经说过,当没有嵌套类似标记时,可以解析html的子集。因此,只要和之间的任何内容不是该标记本身,这将起作用:
$obj = new DOMDocument();
$obj -> load($html);
$obj -> getElementByTagName('el');
$value = $obj -> nodeValue();
由于这是一个合适的解析器,它将能够处理嵌套标记等。标记可以在另一行中完成。这就是为什么需要添加
\n
(?<=\<any_tag\>)(\s*.*\s*)(?=\<\/any_tag\>)
(.|\n)*?
试试这个
<[tag]>(.+?)</[tag]>
(?<=<pre>)(.*?)(?=</pre>)
(?使用以下模式获取元素之间的内容。将[tag]
替换为要从中提取内容的实际元素
<[tag][^>]*>(.+?)</[tag]>
([\r\n\s]*(?!).[\r\n\s]*\s*[\r\n\s]*)(((?!)[\s\s])*)[\r\n\s]*(?!).\124;\ s*)[\r\n\s]*
对于多行:
preg_match_all( '/<((?!<)(.|\n))*?\>/si', $content, $new);
var_dump($new);
(.+)(\s)+(.+))+
这就是我要用的。
))
选择必须附加
标记
根据您的用例,您可能需要添加一些修饰符,如(i或m)
- i-不区分大小写
- m-多行搜索
然而,Javascript不支持lookbehind,因此我们必须忘记使用
(?您可以使用模式Pattern=Pattern.compile([^]”;
preg_match("/<([\w]+)[^>]*>(.*?)<\/\1>/", $subject, $matches);
$matches = array ( [0] => full matched string [1] => tag name [2] => tag content )
var str=“Lorem ipsum text 1 Lorem ipsum text 2”;
str.replace(/(.*)/g,function(match,g1){console.log(g1);});
我使用这个解决方案:
(?=>([^<]+))
preg_match_all('/要排除定界标记,请执行以下操作:
(?这似乎是我发现的所有正则表达式中最简单的一个
(?:)([\s\s]*)(?:)
从匹配项中排除开始标记(?:)
在匹配项中包含任何空白或非空白字符([\s\s]*)
从匹配项中排除结束标记(?:)
preg\u match\u all(/([^>]*?)/,$content,$matches)
此正则表达式将选择标记之间的所有内容。无论是在新行中(使用多行)。在Python中,设置DOTALL
标志将捕获所有内容,包括新行
如果指定了DOTALL标志,则该标志将匹配包括换行符在内的任何字符
捕获文档中所有开始标记和结束标记之间的文本
要捕获文档中所有开始标记和结束标记之间的文本,finditer
非常有用。在下面的示例中,三个开始标记和结束标记此答案假设支持环视!这允许我识别开始标记和结束标记对之间的所有文本。这就是Javasc中“>”和“之间的所有文本这很简单。它包括属性和多行:
preg_match_all( '/<((?!<)(.|\n))*?\>/si', $content, $new);
var_dump($new);
/]*>([\s\s]*?)/
选择我喜欢的预标记之间的所有文本
preg#u match('#([\w\w\s]*)#',$str,$matches);
$matches[0]将有包含标记的结果
$matches[1]将包含所有内容
DomDocument无法在需要在搜索的标记中获取带有标记详细信息的文本的情况下工作,因为它会去除所有标记,nodeValue和textContent将只返回没有标记和属性的文本。(?)[^([^([^)最好的方法是使用类似“Beautiful Soup”的html解析器如果你喜欢python…最好的方法是使用XML/HTML解析器。一般来说,使用正则表达式解析HTML不是一个好主意:不要用正则表达式解析标记之间的文本,因为任意嵌套的标记会使HTML变得不规则。匹配的标记似乎没问题。/.*/.exec(“”
关于添加(.|\n)的要点*?
处理跨多行的HTML标记时。仅当HTML标记位于同一行时,所选答案才有效。(.\n.\r\n)*?对于Windows行尾,切勿使用(.\n)*?
匹配任何字符。始终使用
和s
(单线)修饰符。或[\s\s]*?
解决方法。我想在记事本++中选择代码注释,所以使用这个答案我想出了/\*(.\124;\ n)*?\*/
完成了这项工作——感谢youTry的第一个例子“(.+?)'和预期的效果一样。但是我对第二个没有结果。这不起作用。
将匹配
,
和
@MA Maddin-我想你错过了用实际元素替换[tag],你希望从部分提取内容。哦,是的。这些[]
本应完全省略。这会更清楚,因为它们在正则表达式中的含义以及人们先扫描代码,然后再阅读文本的事实;)请使用文字介绍/解释您的答案。请注意,JavaScript.Ooo当然不支持look behind,但此正则表达式适用于Java。感谢您的说明。这不会选择标记之间的文本,而是包括标记。您需要使用()获取多行标记的选择:(.+)(\s)+(.+)+这仍然具有可见性,因此:如果您在尝试(.*)
后仍然看到
标记,这是因为您看到的是完整匹配捕获的内容,而不是(.*)捕获组。听起来很俗气,但我始终认为“括号=一对小偷”,因为除非<
(?:<TAG>)([\s\S]*)(?:<\/TAG>)
#example.py using Python 3.7.4
import re
str="""Everything is awesome! <pre>Hello,
World!
</pre>
"""
# Normally (.*) will not capture newlines, but here re.DOTATLL is set
pattern = re.compile(r"<pre>(.*)</pre>",re.DOTALL)
matches = pattern.search(str)
print(matches.group(1))
Hello,
World!
#example2.py using Python 3.7.4
import re
# str contains three <pre>...</pre> tags
str = """In two different ex-
periments, the authors had subjects chat and solve the <pre>Desert Survival Problem</pre> with a
humorous or non-humorous computer. In both experiments the computer made pre-
programmed comments, but in study 1 subjects were led to believe they were interact-
ing with another person. In the <pre>humor conditions</pre> subjects received a number of funny
comments, for instance: “The mirror is probably too small to be used as a signaling
device to alert rescue teams to your location. Rank it lower. (On the other hand, it
offers <pre>endless opportunity for self-reflection</pre>)”."""
# Normally (.*) will not capture newlines, but here re.DOTATLL is set
# The question mark in (.*?) indicates non greedy matching.
pattern = re.compile(r"<pre>(.*?)</pre>",re.DOTALL)
matches = pattern.finditer(str)
for i,match in enumerate(matches):
print(f"tag {i}: ",match.group(1))
tag 0: Desert Survival Problem
tag 1: humor conditions
tag 2: endless opportunity for self-reflection
(?<=>)[^<]+
>([^<]+)
(?=>([^<]+))