我想要一个可以在页面上找到错误的PHP正则表达式。因此,当我访问网站并抓取页面时,我可以在网站上列出错误。
目前我有以下代码:
preg_match('/<b>.+<\/b>:.+ in <b>\/.+<\/b> on line <b>[0-9]+<\/b><br( \/)?>/msi',$html,$errors);
它可以显示是否发生了错误,但它不会列出它们!我在数组中获得了完整的html页面($errors[0]
)
有人可以帮忙吗?
编辑: 所以我有一个页面,例如以下HTML源代码,我想从中提取PHP错误:
<b>Warning</b>: session_start() [<a href='function.session-start'>function.session-start</a>]: The session id contains invalid characters, valid characters are only a-z, A-Z and 0-9 in <b>/home/.../public_html/articlescript/init.php</b> on line <b>127</b><br />
<br />
<b>Warning</b>: session_start() [<a href='function.session-start'>function.session-start</a>]: Cannot send session cache limiter - headers already sent (output started at /home/.../public_html/articlescript/init.php:127) in <b>/home/.../public_html/articlescript/init.php</b> on line <b>127</b><br />
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>...
答案 0 :(得分:5)
因为 - 嗯,你知道 - 你不应该使用正则表达式解析HTML,使用PHP’s DOM library试试这个:
libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->loadHTML($str);
$messages = array();
foreach ($doc->getElementsByTagName('b') as $elem) {
if (in_array($elem->textContent, array('Error', 'Warning', 'Notice'))) {
$buffer = $elem->textContent;
while ($elem->nextSibling !== null && strtolower($elem->nextSibling->localName) !== 'br') {
$elem = $elem->nextSibling;
$buffer .= $elem->textContent;
}
$messages[] = $buffer;
}
}
这将搜索内容为“错误”,“警告”或“通知”之一的B
元素,并从那里获取文本内容直到下一个BR
元素。 libxml_use_internal_errors
的初始调用将阻止报告解析错误。
答案 1 :(得分:2)
原谅我的语言,但它是quite foolish to attempt to parse HTML with regular expressions,特别是可能格式错误的HTML。改为使用HTML解析库。
对于HTML中的HTML解析和验证,我会refer to this answer;还可以查看tidy extension。
答案 2 :(得分:1)
请记住在字符串中转义\
。
preg_match_all('#<b>(.+?)</b>:(.+?) in <b>(.+?)</b> on line <b>([0-9]+)</b><br(?: /)?>#is',$string,$errors);
答案 3 :(得分:0)
将括号()
放在要存储在$errors
中的正则表达式位置周围。
您还需要使用preg_match_all()
而不是preg_match()
。
答案 4 :(得分:0)
如果这是您自己的网站,您可以:设置日志级别并解析日志文件(更简单)或使用php -l从命令行运行脚本。