这个正则表达式字符串是什么意思?

时间:2011-02-04 10:15:26

标签: php regex

我正在尝试调试一些PHP,但我对我的正则表达不是很热,有人可以为我翻译这个吗? (即使它是正则表达式)

public static function fetch($number)
    {
        $number = str_replace(" ", "", $number);
        $html = file_get_contents('http://w2.brreg.no/enhet/sok/detalj.jsp?orgnr=' . $number);
        preg_match_all('/\<td style="width.*\<b\>(.*)[: ]*\<\/b\>/msU', $html, $keys);
        preg_match_all('/\<\/b\>.*\<td.*\>(.*)\<\/td\>/msU', $html, $values);

        if (!$keys[1])
        {
            return null;
        }

将PHP代码段保留为上下文,如果有帮助:D 谢谢:))

5 个答案:

答案 0 :(得分:5)

或多或少,它会从{extracted}

返回<td style="width ..."><b>{extracted}: </b>部分

答案 1 :(得分:5)

我只翻译第一个,第二个是类似的。

/                  # regex delimiter
\<td style="width  # match <td style="width  (unnecessary escaping of < !)
.*                 # match anything (as few characters as possible, see below)
\<b\>              # match <b> (again, unnecessary escaping!)
(.*)               # match anything (lazily) and capture it
[: ]*              # match any number of colons or spaces
\<\/b\>            # match </b>
/msU               # regex delimiter; multiline option (unnecessary), 
                   # dot-all option (dot matches newline) 
                   # and ungreedy option (quantifiers are lazy by default).

编辑:U不是Unicode选项,而是ungreedy选项。我的错。毕竟正则表达并不坏:)

我建议改用这些正则表达式:

/<td style="width.*?<b>(.*?)[: ]*<\/b>/s
/<\/b>.*?<td.*?>(.*?)<\/td>/s

答案 2 :(得分:1)

为了帮助理解正则表达式,我建议下载Expresso(对于Windows),这是一个免费的(但需要注册)表达式解析器和测试工具。

答案 3 :(得分:0)

我相信它试图匹配以下结构:

<td width=.....><b>key:</b></td><td>value</td>

它解析字符串两次,一次是键,一次是取自第一列,第二次是取值,取自第二列。

答案 4 :(得分:0)

我想要一个建议,你的正则表达式可能无法按预期工作。在您的情况下,最好使用xpath。

请参阅此代码段:

$str = "
<html>
    <body>
        <table>
        <tr>
            <td style='width:500px'><b>foo : </b> bar</td>
            <td style='width:200;vertical-align:'><b>baz :</b> qux</td>
        </tr>
        </table>
    </body>
</html>
";

$xml = simplexml_load_string($str);

$results = array();
foreach($xml->xpath('//td[@style][b]') as $row) {
    $value = trim(sprintf("%s", $row));
    $key = trim((string)$row->b, ' :');
    $results[$key] = $value;
}

var_dump($results);

将打印

array(2) {
  ["foo"]=>
  string(3) "bar"
  ["baz"]=>
  string(3) "qux"
}