【问题标题】:PHP: searching id tags @ .html filePHP:搜索 id 标签@.html 文件
【发布时间】:2013-11-06 23:16:14
【问题描述】:

我有这个简单的代码,我想在 .html 文件上搜索一些标签,但我遇到了一些错误我只是 php 的新手,我遇到了 'preg_match' 命令。

这是我的简单代码:

<?php
$data['id="test"'] = 'A';

$html = file_get_contents('test.html');

if(preg_match(array_keys($data), $html)) 
{
    echo 'FOUND';
}
else
{
    echo 'NOT FOUND';
}
?>

它给了我一个错误警告:preg_match() 期望参数 1 是字符串,数组中给出

如果 test.html 文件中存在 "id=test" 测试,上面的代码会在 test.html 中搜索。

【问题讨论】:

  • 使用 HTML 解析器,例如 simplehtmldom.sourceforge.net
  • array_keys($data) 返回一个包含 1 个元素的数组:['id="test"']... 这不是字符串
  • 这个错误很容易解释。您尝试过 any 调试吗?您至少应该尝试var_dump(array_keys($data)) 来测试您的假设;你会发现它确实返回了一个数组,而不是一个字符串。

标签: php preg-match file-get-contents array-key


【解决方案1】:

可以看到preg_match需要第一个参数是字符串

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

而array_keys的返回值为“array”

array array_keys ( array $array [, mixed $search_value = NULL [, bool $strict = false ]] )

所以你得到“preg_match() 期望参数 1 是字符串,给定数组”

试试这个:

$data[] = 'id="test"';
$data[] = 'id="test2"';
$data[] = 'id="test3"';
$html = file_get_contents('test.html');
foreach ($data as $search){
 if (strpos($html , $search) !== FALSE)
    echo 'FOUND';
 else
    echo 'NOT FOUND';
}

【讨论】:

  • 我喜欢你的想法,但我需要 $data['id=test'] 所以我可以使用 array_keys 和 array_values 我可以放一些东西。
  • 然后它看起来像这样:$data['id="test"'] = 'A'; foreach ($data as $search =&gt; $value).......
【解决方案2】:

至少,您需要这样做:

<?php
$data['id="test"'] = 'A';
$data=array_keys($data);
$data = preg_quote($data[0],"'");

$html = file_get_contents('test.html');

if(preg_match('~'.$data.'~', $html)) 
{
    echo 'FOUND';
}
else
{
    echo 'NOT FOUND';
}
?>

但是.. 如果您愿意/能够重构 $data 的结构,可以通过多种方式对其进行优化

还请注意,这只会查找完全匹配。如果"test" 用单引号括起来,或者id"test" 之间有空格等,它将不匹配。

简而言之,按照你现在的方式,你还不如直接用strpos

【讨论】:

  • 你能解释一下$data = preg_quote($data[0],"'");什么是$data[0] ?
  • preg_quote 转义 $data 中的任何内容,这是 preg_match 的特殊符号。关于 $data[0] - 正如其他人所提到的,array_keys 返回一个 array,但 preg_match 需要一个 string 值。 $data[0] 引用 $data 数组中的第一个元素,这是一个 string 值,其中包含您的值 id="test"
  • $data[0] 只会找到数组中的第一个元素,所以如果我在数组中添加更多元素,我会一次又一次地定义它们?
  • 嗯,是的。就像我说的,至少你需要按照我展示的那样来修复你发布的代码。然后我告诉你有更好的方法来构建你的数据(例如 DimaK 建议的方法)
  • @Detention 让您退后一步,花一两个小时学习基本语法会大有裨益;)另外,php.net 有函数等的在线文档,它们使它变得超级很容易找到一个条目。例如,您可以直接转到php.net/array_keys,它会将您带到array_keys 条目,其中显示预期的语法、返回类型等。
猜你喜欢
  • 1970-01-01
  • 2012-12-06
  • 2010-10-14
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
相关资源
最近更新 更多