正则表达式匹配php中的特定单词

时间:2017-05-03 13:06:41

标签: php regex

我在php中遇到了字符串preg匹配。 从下面的字符串我需要匹配'index.php?c_id ='并需要获取该字符串的值。 (例如:index.php?c_id = 161377)

$str = '<h3>Resources</h3>
<p><a href="index.php?ci_id=161377">Announcing Upgraded Firmware for N3680 Decoded 2D Imager</a></p>
<p><a href="https://www.honeywellaidc.com/products/oem-scan-engines/2d-imagers/n3680-series">N3680 Product webpage</a></p>
<p><a href="index.php?ci_id=161376">N3680 Product datasheet</a></p>';
preg_match_all('#index.php?([^\s]+)"#', $str, $matches,PREG_OFFSET_CAPTURE);
print_r($matches[1]);

我需要输出: 161377 161376

谢谢&amp;问候 麻醉剂

3 个答案:

答案 0 :(得分:0)

使用正则表达式解析HTML的

在primis 中通常是一个坏主意。它在这里工作只是因为你没有尝试比找到一个单词更复杂的东西,但是在将来避免这种策略,或者你最终会尝试做一些无法做到的事情。

除了警告,你只是在错误的地方寻找。 preg_match&#39; s documentation

  

如果提供了匹配,那么它将填充搜索结果。 $matches[0]将包含与完整模式匹配的文本,$matches[1]将具有与第一个捕获的带括号的子模式匹配的文本,依此类推。

为了找到所有匹配项,您只需查看$matches[0]而不是$matches[1](或从1开始查看$matches的所有位置)

答案 1 :(得分:0)

谢谢你们,感谢您的支持。根据您的意见,我找到了答案。

$str = '<h3>Resources</h3>
<p><a href="index.php?ci_id=161377">Announcing Upgraded Firmware for N3680 Decoded 2D Imager</a></p>
<p><a href="https://www.honeywellaidc.com/products/oem-scan-engines/2d-imagers/n3680-series">N3680 Product webpage</a></p>
<p><a href="index.php?ci_id=161376">N3680 Product datasheet</a></p>';
preg_match_all('/index\.php\?ci_id=([0-9]+)/', $str, $matches,PREG_OFFSET_CAPTURE);
$i=0;
foreach($matches[1] as $key => $val)
{
    echo '<br>'.$val[$i];
}

答案 2 :(得分:0)

不要使用正则表达式来解析html。相反,DomDocument和Xpath可以做这项工作

$dom = new DomDocument();
$dom->loadHTML($str);

$xpath = new DomXpath($dom);
$hrefs = $xpath->evaluate('//a[starts-with(@href, "index.php?ci_id")]/@href');
foreach($hrefs as $href) {
  list(, $ci_id) =  explode('=', $href->nodeValue);
  echo $ci_id ."<br>\n";
}

<强> demo