PHP正则表达式返回<option> values </option>

时间:2012-03-07 01:38:01

标签: php regex pattern-matching web-scraping

只是想知道你是否可以帮我解决一些我想在php中完成的小任务。

我的文件在文件中看起来像这样:

    (random html)
    ...
    <OPTION VALUE="195" SELECTED>Physical Chem  
    <OPTION VALUE="239">Physical Chem Lab II  
    <OPTION VALUE="555">Physical Chem for Engineers            
    ...
    (random html)

我想返回选项值的#值,忽略其他所有内容。 例如,在上面的例子中,我想要195,239&amp; 555返回,没有其他类似“选项值=”。

我在PHP中遇到这个问题。到目前为止,我有这个:

preg_match("/OPTION VALUE=\"([0-9]*)/", $data, $matches);
        print_r($matches);  

使用此值的返回值:

数组([0] =&gt; OPTION VALUE =“195 [1] =&gt; 195)数组([0] =&gt; OPTION VALUE =”195 [1] =&gt; 195)

我怎样才能归还所有的#?

我是模式匹配的新手,我读过的教程没什么用,所以非常感谢!

4 个答案:

答案 0 :(得分:3)

preg_match将返回仅包含第一个匹配项的数组。数组的第一个索引将返回完整正则表达式的匹配,第二个索引匹配括号中的捕获组,请尝试以下方法获取其工作原理的概念:

preg_match("/(OPTION) VALUE=\"([0-9]*)/", $data, $matches);
    print_r($matches);

您将看到它输出以下内容:

Array
(
    [0] => OPTION VALUE="195
    [1] => OPTION
    [2] => 195
)

Array [0]包含完全匹配的数据,array [1]包含来自第一个捕获组(OPTION)的数据,array [2]包含来自第二个捕获组的数据([0-9] *)。 / p>

为了匹配多个匹配项,您需要使用preg_match_all函数。如果我们将其应用于原始代码,请执行以下操作:

preg_match_all("/OPTION VALUE=\"([0-9]*)/", $data, $matches);
    print_r($matches);

我们得到:

Array
(
    [0] => Array
        (
            [0] => OPTION VALUE="195
            [1] => OPTION VALUE="239
            [2] => OPTION VALUE="555
        )

    [1] => Array
        (
            [0] => 195
            [1] => 239
            [2] => 555
        )

)

我希望这能让事情变得清晰!

答案 1 :(得分:2)

我认为你做得对。 PHP返回[0]中的完整匹配,然后返回捕获的组(父对象)作为其他组。

检查一下: http://xrg.es/#15m7krv

答案 2 :(得分:1)

试试这个:

preg_match_all('/OPTION VALUE=\"([0-9])+\"/', $data, $matches);

修改

误解了你的问题。已更改为preg_match_all()

答案 3 :(得分:1)