Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 另一个小型正则表达式问题_Php_Html_Regex - Fatal编程技术网

Php 另一个小型正则表达式问题

Php 另一个小型正则表达式问题,php,html,regex,Php,Html,Regex,我知道不鼓励解析HTML,但事实上,在受控环境下,解析HTML是最好的选择。就我的情况而言,我需要一个正则表达式来查找html页面上所有的预格式化文本()语句。这似乎很简单,谷歌,但我发现没有结果。另外,语句需要包含一个字符串,在我的例子中是“gisformat”。换句话说,这个正则表达式需要返回HTML文件中包含“gisformat”的所有预格式化文本语句。我知道它是这样的,但我不确定中间应该放什么:/(我应该放什么)/ $doc = new DOMDocument(); @$doc->

我知道不鼓励解析HTML,但事实上,在受控环境下,解析HTML是最好的选择。就我的情况而言,我需要一个正则表达式来查找html页面上所有的预格式化文本(
)语句。这似乎很简单,谷歌,但我发现没有结果。另外,
语句需要包含一个字符串,在我的例子中是“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>
      )
 )