的index.php:
<?php
$page = file_get_contents('a.html');
$arr = array();
preg_match('/<td class=\"myclass\">(.*)\<\/td>/s',$page,$arr);
print_r($arr);
?>
a.html:
...other content
<td class="myclass">
THE
CONTENT
</td>
other content...
Array
(
[0] => Array
(
)
)
preg_match('/<td class=\"myclass\">(.*)\<\/t/s',$page,$arr);
Array
(
[0] => <td class="myclass">
THE
CONTENT
</t
[1] =>
THE
CONTENT
)
<td class="myclass">
和</td>
之间的内容。答案 0 :(得分:2)
您的代码似乎有效。我编辑了正则表达式以使用不同的分隔符并获得更清晰的视图。如果HTML中有多个myclass TD,您可能需要使用ungreedy修饰符。
我无法重现您注意到的“数组数组”行为,除非我操纵代码添加错误 - 请参阅底部。
<?php
$page = <<<PAGE
...other content
<td class="myclass">
THE
CONTENT
</td>
other content...
PAGE;
preg_match('#<td class="myclass">(.*)</td>#s',$page,$arr);
print_r($arr);
?>
按预期返回:
Array
(
[0] => <td class="myclass">
THE
CONTENT
</td>
[1] =>
THE
CONTENT
)
以下代码与您的代码类似,但已被修改为导致相同的错误。但是,你似乎不太可能这样做。修改正则表达式以使不匹配,并将生成的空数组存储到 $ arr [0] 而不是$arr
。
preg_match('#<td class="myclass">(.*)</ td>#s',$page,$arr[0]);
返回您观察到的同一错误:
Array
(
[0] => Array
(
)
)
如果我使用正则表达式,我可以复制您观察到的相同行为(适用于</t
,不适用于</td>
),但修改HTML以使其</t d>
。如果我也希望获得相同的输出,我仍然需要写入$arr[0]
而不是$arr
。
答案 1 :(得分:1)
您是否理解preg_match
的第3个参数是匹配项,它将包含匹配项,然后其他元素将显示捕获的模式。
http://ca3.php.net/manual/en/function.preg-match.php
如果提供了匹配,那么它将填充搜索结果。 $ matches [0]将包含与完整模式匹配的文本,$ matches [1]将具有与第一个捕获的带括号的子模式匹配的文本,依此类推。
此代码
preg_match('/<td class=\"myclass\">(.*)\<\/t/s',$page,$arr);
申请时
...other content
<td class="myclass">
THE
CONTENT
</td>
other content...
将返回$ arr [0]中的匹配和$ arr [1]中的(。*)结果。结果是正确的:[1]
中有您的内容Array
(
[0] => <td class="myclass">
THE
CONTENT
</t
[1] =>
THE
CONTENT
<?php
header('Content-Type: text/plain');
$page = 'A B C D E F';
$arr = array();
preg_match('/C (D) E/', $page, $arr);
print_r($arr);
Array
(
[0] => C D E // This is the string found
[1] => D // this is what I wanted to look for and extracted out of [0], the matched parenthesis
)
答案 2 :(得分:0)
你的正则表达式似乎是正确的。 preg_match的语法不是如下吗?
preg_match('/<td class=\"myclass\">(.*)\<\/td>/s',$page,$arr);
正则表达式中的|
代表or