PHP preg_match指定数字,并按特定数字的区域获取节ID

时间:2015-12-17 23:16:08

标签: php

我希望根据入口号码从此文本中获取部分ID 周期。

<li id="section-1" role="example" label="1 - 6">
<li id="section-2" role="example" label="6 - 12">
<li id="section-3" role="example" label="12 - 18">
<li id="section-4" role="example" label="18 - 24">

例如,当我输入 8 期间 6 - 12 时,我会得到&#34; 第2部分&#34 ; , 21 将获得&#34; 第4节&#34;等...

2 个答案:

答案 0 :(得分:3)

您可以尝试这样的事情:

<?php

$text = '<li id="section-1" role="example" label="1 - 6">
<li id="section-2" role="example" label="6 - 12">
<li id="section-3" role="example" label="12 - 18">
<li id="section-4" role="example" label="18 - 24">';

$pattern = '<li id="section-([0-9]+)" role="example" label="([0-9]+) - ([0-9]+)">';

function find_section($value) {
    global $text, $pattern;

    preg_match_all($pattern, $text, $results);

    $index = 0;
    foreach($results[3] as $max) {
        if ($value < $max) {
            break;
        }
        $index++;
    }

    return "section-{$results[1][$index]}   {$results[2][$index]} - {$results[3][$index]}\n";
}

echo find_section(6);  // section-2   6 - 12
echo find_section(21); // section-4   18 - 24

http://ideone.com/uCzCkm

答案 1 :(得分:1)

假设你知道自己在做什么,我会选择这样的功能:

function find_section($html, $value)
{
    static $pattern = '/<li id="section\\-(\\d+)" role="example" label="(\\d+) \- (\\d+)"(>)/';
    $offset = 0;

    while (preg_match($pattern, $html, $matches, PREG_OFFSET_CAPTURE, $offset))
    {
        $section_id = (int) $matches[1][0];
        $range_min = (int) $matches[2][0];
        $range_max = (int) $matches[3][0];
        $offset = $matches[4][1] + 1;

        if ($value >= $range_min && $value < $range_max)
        { return 'section-' . $section_id; }
    }

    return null;
}

我个人不知道单一preg_match电话的可能性。我说这是不可能的。上面的函数将扫描给定的li - HTML元素的HTML字符串。模式,提取它们的范围并将给定值与它进行比较。

取决于您实际想要达到的目标,例如如果你正在搜索多个值的节,你可能想要先扫描所有li - 元素并将它们存储为更容易访问的数据(例如数组或stdclass对象),所以你赢了# 39;每次搜索值的部分时都必须重新匹配整个HTML代码。

上述函数的一个简单的小测试代码(只是为了展示它是如何工作的)将是:

$html = '
    <li id="section-1" role="example" label="1 - 6">
    <li id="section-2" role="example" label="6 - 12">
    <li id="section-3" role="example" label="12 - 18">
    <li id="section-4" role="example" label="18 - 24">
';

echo find_section($html, 8) . "\n";
echo find_section($html, 21) . "\n";
echo find_section($html, 50) . "\n";

输出:

section-2
section-4

(使用PHP 5.5.15测试)