我有一个脚本来检查页面中是否存在URL。这是:
class LP_backlinkchecker
{
var $url;
var $content;
var $links;
var $linktocheck;
function __construct($url, $linktocheck)
{
$this->url = $url;
$this->linktocheck = $linktocheck;
}
function SetLinktocheck($link)
{
$this->linktocheck = $link;
}
function getContents()
{
$this->content = file_get_contents($this->url);
}
function lpFetchLinks()
{
$regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";
preg_match_all("/$regexp/siU", $this->content, $matches);
$this->links = $matches;
return $matches;
}
function check()
{
foreach($this->links[2] as $key => $url)
{
if($url == $this->linktocheck)return TRUE;
}
return FALSE;
}
}
我的问题是该脚本仅适用于检查同一站点上的链接。当要检查的链接在网站之外时,它不起作用。例如,该脚本可以很好地检查链接 http://web.com/linktocheck出现在网站http://web.com/
上如果认为我的$ regexp错了,你对这个问题有所了解吗?
感谢您的帮助。
答案 0 :(得分:0)
不确定我是否误解了您的问题,但您的代码似乎对我有用。我给你写了一个小单元测试,你现在可以拥有并扩展,如果你能编写一个不起作用的测试,我可以帮助更多。
class LP_backlinkcheckerTest extends PHPUnit_Framework_TestCase
{
public $l;
public function setUp()
{
$this->l = new LP_backlinkchecker('test.html', null);
}
public function tearDown()
{
}
public function testGetContents()
{
$this->l->getContents();
$this->assertNotEmpty($this->l->content);
}
public function testlpFetchLinks()
{
$this->l->getContents();
$matches = $this->l->lpFetchLinks();
$expected = array(
"http://google.com",
"http://www.bluesnews.com",
"http://www.bluesnews.com/somepage"
);
// 4 things captured by the regex
$this->assertEquals(4, count($matches));
$this->assertEquals($expected, $matches[2]);
}
}
和我正在使用的HTML文件
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<a href="http://google.com">Google.com</a>
<a href="http://www.bluesnews.com">BluesNews.com</a>
<a href="http://www.bluesnews.com/somepage">somepage</a>
</body>
</html>
虽然最好让你的课程让我不必提供一个文件,但这就是你设计它的方式。我还建议使用parse_url将url分解为它的组成部分。您的问题可能只是您期望一个字符串与另一个字符串相等,并且在构造时可能存在用户输入错误,您根本不会检查。