Php 获取正则表达式的一部分
我正在尝试解析一个HTML页面并获取一个特定的数据(使用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)。我可以用正则表达式吗 更多信息 我可以假设这个特殊的结构不
$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
$pattern = '/(?:class="group"[^>]*>|class="mk"[^>]*>)\s*(\d+)/'
preg_match_all($pattern, $subject, $matches);
这将捕获捕获组中想要的类标记之后的所有数字(即$matches[1]
)。显然,这只是一个快速而肮脏的解决方案,因为只要在HTML中做一些修改就会破坏它:但是既然你说这是一个非常有限的用途。。。(如果它易受更改,您应该真正考虑HTML解析器解决方案)
一些解释
:(\d+)
是\d
的快捷方式,括号是捕获组。捕获组允许您将它匹配的内容存储在变量中,以便可以在同一个正则表达式中重用它,或者以后可以提取它。这里,第一个捕获组结果将存储在[0-9]
中$matches[1]
:此结构是非捕获组。它允许您使用括号对模式进行分组,而无需捕获它们。它只允许你储存你想要的东西(?:…)
:管道的意思是|
表示除方括号内的内容以外的任何内容(方括号内的[^…]
是一个特殊字符)^
是任何类型空白(换行符、制表符、空白…)的快捷方式\s
$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=“…
文本,而不仅仅是数字。我知道我可以很容易地提取数字,但我想可能有一种方法可以将数字输入