我正在尝试调试一些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 谢谢:))
答案 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"
}