我正在尝试使用php.net上的user contributed notes代码来get_meta_tags函数。从它看来,如果元标记格式为<meta content="foo" name="bar" />
,那么代码将会错过它。目前,只有格式为<meta name="bar" content="foo"/>
的标签才有效。我对正则表达式并不好,并试图修复它没有成功。这是一个url的示例,它似乎滑过了正则表达式。提前道歉我的问题不一定是关于get_meta_tags
功能,但似乎这可能与人们在该功能中遇到的其他一些问题失去联系。
似乎问题就在这附近:
preg_match_all('/<[\s]*meta[\s]*(name|property)="?' . '([^>"]*)"?[\s]*' . 'content="?([^>"]*)"?[\s]*[\/]?[\s]*>/si', $contents, $match);
可能需要像:
preg_match_all('/<[\s]*meta[\s]*(name|property|content)="?' . '([^>"]*)"?[\s]*' . '(content|name)="?([^>"]*)"?[\s]*[\/]?[\s]*>/si', $contents, $match);
但同样,我对正则表达式非常糟糕。有什么想法吗?
答案 0 :(得分:1)
一个想法是捕获lookahead内的元名/属性,使其独立于序列:
function extract_meta_tags($source)
{
$pattern = '
~<\s*meta\s
# using lookahead to capture type to $1
(?=[^>]*?
\b(?:name|property|itemprop|http-equiv)\s*=\s*
(?|"\s*([^"]*?)\s*"|\'\s*([^\']*?)\s*\'|
([^"\'>]*?)(?=\s*/?\s*>|\s\w+\s*=))
)
# capture content to $2
[^>]*?\bcontent\s*=\s*
(?|"\s*([^"]*?)\s*"|\'\s*([^\']*?)\s*\'|
([^"\'>]*?)(?=\s*/?\s*>|\s\w+\s*=))
[^>]*>
~ix';
if(preg_match_all($pattern, $source, $out))
return array_combine(array_map('strtolower', $out[1]), $out[2]);
return array();
}
见test at regex101。使用branch reset功能提取不同报价样式的值。
print_r(extract_meta_tags($str));
尝试使用一些不同的数据at eval.in
在html <head>
部分使用此功能。获取页面源并提取头部:
1。)使用cURL,file_get_contents或fsockopen获取来源。
2.。)使用dom或正则表达式like this: <head>
提取(?is)<head\b[^>]*>(.*?)</head>
3.。)使用提供的正则表达式或try with a parser从<head>
提取元标记。