Php 另一个小型正则表达式问题
我知道不鼓励解析HTML,但事实上,在受控环境下,解析HTML是最好的选择。就我的情况而言,我需要一个正则表达式来查找html页面上所有的预格式化文本(Php 另一个小型正则表达式问题,php,html,regex,Php,Html,Regex,我知道不鼓励解析HTML,但事实上,在受控环境下,解析HTML是最好的选择。就我的情况而言,我需要一个正则表达式来查找html页面上所有的预格式化文本()语句。这似乎很简单,谷歌,但我发现没有结果。另外,语句需要包含一个字符串,在我的例子中是“gisformat”。换句话说,这个正则表达式需要返回HTML文件中包含“gisformat”的所有预格式化文本语句。我知道它是这样的,但我不确定中间应该放什么:/(我应该放什么)/ $doc = new DOMDocument(); @$doc->
)语句。这似乎很简单,谷歌,但我发现没有结果。另外,
语句需要包含一个字符串,在我的例子中是“gisformat”。换句话说,这个正则表达式需要返回HTML文件中包含“gisformat”的所有预格式化文本语句。我知道它是这样的,但我不确定中间应该放什么:/(我应该放什么)/
$doc = new DOMDocument();
@$doc->loadHTML($subject);
$preNodes = $doc->getElementsByTagName('pre');
foreach($preNodes as $preNode) {
if (strpos($preNode->nodeValue, 'gisformat') !== false)
$result[] = $preNode->ownerDocument->saveXML($preNode);
}
print_r($result);
# the opening tag #
<pre\b [^>]* >
# content before the first "gisformat" #
(?>
[^<g]+ # all that is not a "<" or a "g"
| # OR
g(?!isformat) # a "g" not followed by "isformat"
| # OR
<(?!/pre) # a "<" not followed by "/pre"
)* # repeat the group zero or more times
# target #
gisformat
# content until the closing tag #
(?>[^<]+|<(?!/pre>))*
# closing tag #
</pre>
编辑1:我正在使用PHP,是的,我看过这篇文章,包括答案2,一个正则表达式:
<pre>[^<]*?gisformat[^<]*?</pre>
图案详情:
# '~(?s)(?&PRE)(?(DEFINE)(?<PRE><pre>(?:(?&Core)gisformat(?&Core))</pre>)(?<Core>(?:(?>(?:(?!</?pre>|gisformat).)*)|(?&PRE)|(?&POST))*)(?<POST><pre>(?:(?:(?>(?:(?!</?pre>).)*)|(?&POST))*)</pre>))~'
# -----------------------------------
(?s) # Dot-All modifier
(?&PRE) # Main function call
# -----------------------------------
# Subroutines
(?(DEFINE)
(?<PRE>
<pre>
(?:
(?&Core)
gisformat
(?&Core)
)
</pre>
)
(?<Core>
(?:
(?>
(?:
(?! </?pre> | gisformat )
.
)*
)
|
(?&PRE)
|
(?&POST)
)*
)
(?<POST>
<pre>
(?:
(?:
(?>
(?:
(?! </?pre> )
.
)*
)
|
(?&POST)
)*
)
</pre>
)
)
#开始标记#
]* >
#第一个“格式”之前的内容#
(?>
[^如果您已经阅读了之前的文章,并且理解了尝试在HTML上使用正则表达式的缺点,我们可以提供一个基本的正则表达式来完成这项工作
<代码> [^ < P>如果标签是平衡的,引擎是PCRE兼容的,那么在中间某个地方就会找到<代码> GISFrase。
由RegexFormat4处理
#'(?)s)(?&PRE)(?(定义)(?(?:(?&Core)gisformat(?&Core))(?(?:(?>(?:(!)gisformat.)*)(?:(?&PRE)(?&POST))*(?:(?:(?>(?:(?!)*)((?:((?:(?!)(?&POST)))
# -----------------------------------
(?s)#点所有修改器
(?&PRE)#主函数调用
# -----------------------------------
#子程序
(?(定义)
(?
(?:
(?&核心)
gisformat
(?&核心)
)
)
(?
(?:
(?>
(?:
(?!|格式)
.
)*
)
|
(?&PRE)
|
(?&POST)
)*
)
(?
(?:
(?:
(?>
(?:
(?! )
.
)*
)
|
(?&POST)
)*
)
)
)
为什么不使用DOM解析器呢?您可以很容易地获得
元素的集合,然后在集合中的这些项目中进行搜索。这可能根本不需要正则表达式就可以完成,因为您似乎需要在元素中进行简单的字符串搜索。另外,您使用的是什么语言?不鼓励使用“我知道事实上,在受控情况下,这是最好的选择”。这将是一个观点,也是一个不好的观点。使用将是一个更好的方法。DOM解析器可能会工作,我不知道这一点…是否有一个用于PHP的软件包要安装?@user3048179:在PHP中使用DOMDocument或XPath不需要安装任何东西。哇,这个正则表达式比我预期的要长。你能编辑并将正则表达式分解为每个部分吗根据它的用途分组?我对正则表达式相当陌生,这有点难以理解。谢谢!@Marabunta:要让它与在线测试程序一起工作,你必须删除~delimiter并转义模式中的所有斜杠,因为斜杠通常是在线测试程序中的默认分隔符。因此,如果我理解正确,如果有no预标记和已知HTML之间的HTML标记保证以已知的方式格式化,这应该始终有效。对吗?这应该始终有效。再次,我将使用regexpal在真实HTML上进行测试,但我不认为有任何理由不这样做
# '~(?s)(?&PRE)(?(DEFINE)(?<PRE><pre>(?:(?&Core)gisformat(?&Core))</pre>)(?<Core>(?:(?>(?:(?!</?pre>|gisformat).)*)|(?&PRE)|(?&POST))*)(?<POST><pre>(?:(?:(?>(?:(?!</?pre>).)*)|(?&POST))*)</pre>))~'
# -----------------------------------
(?s) # Dot-All modifier
(?&PRE) # Main function call
# -----------------------------------
# Subroutines
(?(DEFINE)
(?<PRE>
<pre>
(?:
(?&Core)
gisformat
(?&Core)
)
</pre>
)
(?<Core>
(?:
(?>
(?:
(?! </?pre> | gisformat )
.
)*
)
|
(?&PRE)
|
(?&POST)
)*
)
(?<POST>
<pre>
(?:
(?:
(?>
(?:
(?! </?pre> )
.
)*
)
|
(?&POST)
)*
)
</pre>
)
)