如何使用正则表达式获取价值? [复制]

Posted

技术标签:

【中文标题】如何使用正则表达式获取价值? [复制]【英文标题】:How to get the value using Regex? [duplicate] 【发布时间】:2013-04-20 07:47:08 【问题描述】:

您好,我的正则表达式代码有问题,我使用 phphtml 标记中获取值。我可能有以下字符串:

<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。而且写的很详细,谢谢:) 请解释一下模式。为什么会这样? @HamZaDzCyber​​DeV: 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 代码中的文本吗? [复制]

如何使用长正则表达式进行行延续? [复制]

从 xml 字符串获取结果集元素的正则表达式是啥? [复制]

java - 如何使用正则表达式验证Java中的URL? [复制]