Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/72.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_Parsing - Fatal编程技术网

Php 获取正则表达式的一部分

Php 获取正则表达式的一部分,php,html,regex,parsing,Php,Html,Regex,Parsing,我正在尝试解析一个HTML页面并获取一个特定的数据(使用PHP)。 这是我的正则表达式: $pattern = '/class=\"group\">.*[\n\r]*.*[\n\r]*.*[\n\r]*.*/'; preg_match_all($pattern, $subject, $matches); 这就是我发现的(以黄色突出显示): 22 5 一些文本 5 但实际上我所需要的是用红色圈起来的数据(22104004)。我可以用正则表达式吗 更多信息 我可以假设这个特殊的结构不

我正在尝试解析一个HTML页面并获取一个特定的数据(使用PHP)。 这是我的正则表达式:

$pattern = '/class=\"group\">.*[\n\r]*.*[\n\r]*.*[\n\r]*.*/';
preg_match_all($pattern, $subject, $matches);
这就是我发现的(以黄色突出显示):


22
5
一些文本

5
但实际上我所需要的是用红色圈起来的数据(22104004)。我可以用正则表达式吗

更多信息


我可以假设这个特殊的结构不会改变。HTML主要是一个包含几行的表,其中一些包含我想要获取的数据(组号和MK号)。

如果HTML是常量,则始终使用此模式,您可以使用易于中断的正则表达式:

$pattern = '/(?:class="group"[^>]*>|class="mk"[^>]*>)\s*(\d+)/'
preg_match_all($pattern, $subject, $matches);
这将捕获捕获组中想要的类标记之后的所有数字(即
$matches[1]
)。显然,这只是一个快速而肮脏的解决方案,因为只要在HTML中做一些修改就会破坏它:但是既然你说这是一个非常有限的用途。。。(如果它易受更改,您应该真正考虑HTML解析器解决方案)

一些解释

  • (\d+)
    \d
    [0-9]
    的快捷方式,括号是捕获组。捕获组允许您将它匹配的内容存储在变量中,以便可以在同一个正则表达式中重用它,或者以后可以提取它。这里,第一个捕获组结果将存储在
    $matches[1]
  • (?:…)
    :此结构是非捕获组。它允许您使用括号对模式进行分组,而无需捕获它们。它只允许你储存你想要的东西
  • |
    :管道的意思是
  • [^…]
    表示除方括号内的内容以外的任何内容(方括号内的
    ^
    是一个特殊字符)
  • \s
    是任何类型空白(换行符、制表符、空白…)的快捷方式

如果您的HTML是常量,则始终使用此模式,您可以使用易于中断的正则表达式:

$pattern = '/(?:class="group"[^>]*>|class="mk"[^>]*>)\s*(\d+)/'
preg_match_all($pattern, $subject, $matches);
这将捕获捕获组中想要的类标记之后的所有数字(即
$matches[1]
)。显然,这只是一个快速而肮脏的解决方案,因为只要在HTML中做一些修改就会破坏它:但是既然你说这是一个非常有限的用途。。。(如果它易受更改,您应该真正考虑HTML解析器解决方案)

一些解释

  • (\d+)
    \d
    [0-9]
    的快捷方式,括号是捕获组。捕获组允许您将它匹配的内容存储在变量中,以便可以在同一个正则表达式中重用它,或者以后可以提取它。这里,第一个捕获组结果将存储在
    $matches[1]
  • (?:…)
    :此结构是非捕获组。它允许您使用括号对模式进行分组,而无需捕获它们。它只允许你储存你想要的东西
  • |
    :管道的意思是
  • [^…]
    表示除方括号内的内容以外的任何内容(方括号内的
    ^
    是一个特殊字符)
  • \s
    是任何类型空白(换行符、制表符、空白…)的快捷方式
根据您更新的信息(…我想要获取的数据(组号和MK号)),您只需使用XPath即可:

$dom=new DOMDocument("1.0","UTF-8");
$dom->loadHTML($html);
$xpath=new DOMXPath($dom);
foreach($xpath->query('//td[@class="group" or @class="mk"]') as $node)
{
    echo $node->attributes->getNamedItem("class")->nodeValue; /* class name */
    echo ": ";
    echo $node->textContent; /* data */
    echo "\n";
}

无换行/行号陷阱。

根据您更新的信息(…我想要获取的数据(组号和MK号)),您只需使用XPath即可:

$dom=new DOMDocument("1.0","UTF-8");
$dom->loadHTML($html);
$xpath=new DOMXPath($dom);
foreach($xpath->query('//td[@class="group" or @class="mk"]') as $node)
{
    echo $node->attributes->getNamedItem("class")->nodeValue; /* class name */
    echo ": ";
    echo $node->textContent; /* data */
    echo "\n";
}



无换行符/行号陷阱。

显示表格的hmtl@ItayGal请发布HTML并明确定义匹配背后的逻辑。你需要让我们更容易帮助你。使用图像只是让测试变得困难。@ItayGal,你能发布HTML而不是图像来进行测试吗?显示更多上下文HTML。显示表格的hmtl@ItayGal请发布HTML并明确定义匹配背后的逻辑。你需要让我们更容易帮助你。您使用图像只是让测试变得困难。@ItayGal,您可以发布HTML而不是图像来进行测试吗?显示更多上下文HTML。HTML包含换行符,并且没有
[\n\r]
我的正则表达式不起作用。因为您还没有发布正则表达式(发布您的正则表达式!)我只能假设您没有使用自动解析新行的
preg\u match\u all
\n\r
)-您应该这样做。@ItayGal:好吧,仅供参考,您可以使用
s
标志来允许通配符
也匹配换行符:
/这里是我的正则表达式/s
。@scrowler:我相信他已经发布了,问题的前三行:)@Robin,据我所知,你的正则表达式只针对类部分和后面的数字。更好的是,它仍然返回
class=“..
文本,而不仅仅是数字。我知道我可以很容易地提取数字,但我认为可能有一种方法可以在一个正则表达式中获取数字。@ItayGal:Yep,正则表达式同时针对这两个对象。但是
(\d+)中的括号
是一个捕获组,这意味着它们匹配的值将存储在另一个变量中:这里您应该查看
$matches[1]
中的内容,其中包含第一个捕获组匹配的内容。HTML包含换行符,没有
[\n\r]
我的正则表达式不起作用。因为您还没有发布您的正则表达式(发布正则表达式!)我只能假设您没有使用自动解析新行的
preg\u match\u all
\n\r
)-你应该这么做。@ItayGal:好吧,仅供参考,你可以使用
s
标志来允许通配符
也匹配换行符:
/这里是我的正则表达式/s
@scrowler:我相信他已经发布了,问题的前三行:)@Robin,据我所知,您的正则表达式只针对类部分及其后面的数字。这样更好,但它仍然返回
class=“…
文本,而不仅仅是数字。我知道我可以很容易地提取数字,但我想可能有一种方法可以将数字输入