如何使用正则表达式获取价值? [复制]
Posted
技术标签:
【中文标题】如何使用正则表达式获取价值? [复制]【英文标题】:How to get the value using Regex? [duplicate] 【发布时间】:2013-04-20 07:47:08 【问题描述】:您好,我的正则表达式代码有问题,我使用 php 从 html 标记中获取值。我可能有以下字符串:
<span class="down last_position">xyz</span>
<span class="up last_position">xyz</span>
<span class="last_position new">xyz</span>
我有以下 preg_match 命令:
preg_match('#<span class="last_position.*?">(.+)</span>#', $string, $matches);
这几乎涵盖了案例#3。所以我想知道我需要在 last_position 前面添加什么来获得所有可能的情况..?
非常感谢..
编辑:对于所有想知道要匹配什么值的人:“xyz”
【问题讨论】:
不要使用正则表达式解析 HTML。虽然在某些情况下可以使用正则表达式,但您所做的任务最好使用 HTML 解析器来完成。 是的,我知道,我正在使用 DomDocument 进行整个解析。我只是想知道是否有人会知道... ***.com/questions/6366351/… 【参考方案1】:避免使用正则表达式来解析 HTML,因为它容易出错。使用 DOM 解析器可以更好地解决您的特定用例:
$html = <<< EOF
<span class="down last_position">xyz</span>
<span class="up last_position">xyz</span>
<span class="last_position new">xyz</span>
EOF;
$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTML($html); // loads your html
$xpath = new DOMXPath($doc);
$nodeList = $xpath->query("//span[contains(@class, 'last_position')]/text()");
for($i=0; $i < $nodeList->length; $i++)
$node = $nodeList->item($i);
var_dump($node->nodeValue);
输出:
string(3) "xyz"
string(3) "xyz"
string(3) "xyz"
【讨论】:
关于性能什么是最好的使用 Dom 或 preg_match_all ? @ElSinus:人们也抱怨正则表达式的表现。所以我很确定哪一个会更快。【参考方案2】:尝试以下方法(是的,您可以使用正则表达式匹配来自 HTML 的数据):
$string = '<span class="down last_position">xyz</span>
<span class="up last_position">xyz</span>
<span class="last_position new">xyz</span>';
preg_match_all('#<span\s.*?class=".*?last_position.*?".*?>(.+?)</span>#i', $string, $m);
print_r($m);
Online demo.
【讨论】:
我接受了这个答案作为答案,因为我的问题不是如何使用 DomDocument 而是使用 Regex。而且写的很详细,谢谢:) 请解释一下模式。为什么会这样? @HamZaDzCyberDeV:almost all situations
你如何量化“几乎所有”? regex101.com/r/tZ3pA2我的选票被锁定了,我无能为力,但我认为这个答案不值得投票。
@nhahtdh 好的,你让我明白了,我不会争论,因为你首先反对将正则表达式用于 HTML 的想法。【参考方案3】:
尝试使用这个
preg_match('#<span class="?(.*)last_position.*?">(.+)</span>#', $string, $matches);
【讨论】:
请注意,如果一堆span标签在同一行,这是行不通的。 @nhahtdh 问题中没有提到。 这取决于您要做出多少假设。目前,它很容易因换行而中断。 请解释一下模式。为什么会这样?【参考方案4】:你可以试试这个:
preg_match_all('#<span class="[^"]*last_position[^"]*">(.+)</span>#', $string, $matches, PREG_PATTERN_ORDER);
然后您将在$matches[1][0]
、$matches[1][1]
、$matches[1][2]
....中找到值。
我在类属性值[^"]*
中添加的部分匹配不匹配双引号的任意数量的字符。因此它匹配属性值内的任何内容。
【讨论】:
【参考方案5】:当然,使用 RegEx 解析 XML 是不可能的,因为 XML 不规则。但在许多实际情况下,用作输入的 XML 文档是有限且可预测的,足以被简单地视为文本。
这样的东西应该适合你:
preg_match('#<span class="[^>"]*?last_position[^>"]*">(.+)</span>#', $string, $matches);
【讨论】:
请解释一下模式。为什么会这样?以上是关于如何使用正则表达式获取价值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
有人可以用我的正则表达式帮助我获取 html 代码中的文本吗? [复制]