检索a<;标题>;在PHP中

检索a<;标题>;在PHP中,php,html,parsing,Php,Html,Parsing,我正在做一个书签系统,寻找用PHP检索页面标题的最快(最简单)的方法 如果有像$title=page\u title($url)Regex这样的东西就好了 用于获取$htmlSource变量的内容 preg_match('/<title>(.*)<\/title>/iU', $htmlSource, $titleMatches); print_r($titleMatches); preg_匹配('/(.*)/iU',$htmlSource,$titleMatches)

我正在做一个书签系统,寻找用PHP检索页面标题的最快(最简单)的方法

如果有像
$title=page\u title($url)

Regex这样的东西就好了

用于获取$htmlSource变量的内容

preg_match('/<title>(.*)<\/title>/iU', $htmlSource, $titleMatches);

print_r($titleMatches);
preg_匹配('/(.*)/iU',$htmlSource,$titleMatches);
印刷(标题匹配);
看看你在那个阵列里有什么

大多数人都说HTML遍历应该使用解析器,因为正则表达式可能不可靠

其他答案提供了更多细节:)

输出:谷歌

希望对您的使用足够通用。如果您需要更强大的功能,那么花一点时间研究HTML解析器可能不会有什么坏处


编辑:添加了一点错误检查。有点匆忙推出了第一个版本,抱歉。

或者让这个简单的功能稍微防弹:

function page_title($url) {

    $page = file_get_contents($url);

    if (!$page) return null;

    $matches = array();

    if (preg_match('/<title>(.*?)<\/title>/', $page, $matches)) {
        return $matches[1];
    } else {
        return null;
    }
}


echo page_title('http://google.com');
功能页\标题($url){
$page=文件获取内容($url);
如果(!$page)返回空值;
$matches=array();
if(preg_match(“/(.*?/”,$page,$matches)){
返回$matches[1];
}否则{
返回null;
}
}
回显页面标题('http://google.com');

我喜欢将SimpleXml与正则表达式一起使用,这是我用来从我创建的OpenID库中的页面中获取多个链接头的解决方案。我已经对它进行了调整,以适应标题(尽管通常只有一个标题)

函数getTitle($sFile) { $sData=文件获取内容($sFile); 如果(预匹配('/]*>.*/is',$sData,$aHead)) { $sDataHtml=preg_replace('/]*)>/i',strtolower(''),$aHead[0]); $xTitle=simplexml_import_dom(DomDocument::LoadHtml($sDataHtml)); 返回(字符串)$xTitle->head->title; } 返回null; } echo getTitle('http://stackoverflow.com/questions/399332/fastest-way-to-retrieve-a-title-in-php'); 具有讽刺意味的是,这个页面的title标签中有一个“title标签”,这有时会导致纯正则表达式解决方案出现问题


此解决方案并不完美,因为它是小写的标记,如果格式化/大小写很重要(如XML),则可能会导致嵌套标记出现问题,但有一些方法更容易解决此问题。

您可以在不使用reg表达式的情况下获得它:

$title = '';
$dom = new DOMDocument();

if($dom->loadHTMLFile($urlpage)) {
    $list = $dom->getElementsByTagName("title");
    if ($list->length > 0) {
        $title = $list->item(0)->textContent;
    }
}

用于处理已添加属性的标题标记的函数

function get_title($html)
{
    preg_match("/<title(.+)<\/title>/siU", $html, $matches);
    if( !empty( $matches[1] ) ) 
    {
        $title = $matches[1];

        if( strstr($title, '>') )
        {
            $title = explode( '>', $title, 2 );
            $title = $title[1];

            return trim($title);
        }   
    }
}

$html = '<tiTle class="aunt">jemima</tiTLE>';
$title = get_title($html);
echo $title;
函数获取标题($html)
{

preg_match(“/我还做了一个书签系统,发现由于PHP5,您可以使用
stream_get_line
加载远程页面,直到结束标题标记(而不是加载整个文件),然后使用
explode
(而不是a)删除开始标题标记之前的内容

功能页\标题($url){
$title=false;
如果($handle=fopen($url,“r”)){
$string=stream\u get\u line($handle,0,“”);
fclose($handle);
$string=(分解(“,$string))[1]);
}
}
返回$title;
}

最后
爆炸
多亏了PlugTrade的提醒,标题标签可以有属性。

也许应该改为非贪婪以确保安全,但我如何获得$htmlSource?在这种情况下,我认为可以安全地假设解析器会过度使用。/同意非贪婪匹配您可以使用cu获取$htmlSource我正在寻找一种更好的方法来做这件事,但是看起来大多数人都使用你提出的解决方案作为一个快速的方法来取回标题。请考虑使用“S”修饰符,我看到奇怪的情况,一个新的线打破了RexEy,我被一个有两个标题标签的页面捕获了一次。g
@
,真的吗?@Louis MarieMatthews Man这是2008年的答案,当时的情况完全不同。修复。奇怪,出于某些原因阅读2017!无论哪种方式,更正答案都不会太晚,因为初学者将来可能会访问它。我相对确定,如果找不到模式,将产生错误。初始化$标题优先,分配preg_match()在尝试访问$title\u matches数组的第一个元素之前,将其设置为布尔值并进行检查。哦,太对了。如果preg\u match没有得到结果,则对$title\u matches的引用将出现呕吐。这将稍微整理一下。Facebook的title标记如下所示:
这是第一个使用deadspin.com的解决方案。您可能需要调用
libxml\u使用内部错误(true);
在使用
DOMDocument
之前。不幸的是,到目前为止,底层库
DOMDocument
用于解析HTML(libxml)仍然不支持HTML5(毕竟它是一个XML库),并且会对HTML5语义标记(例如

function getTitle($sFile)
{
    $sData = file_get_contents($sFile);

    if(preg_match('/<head.[^>]*>.*<\/head>/is', $sData, $aHead))
    {   
        $sDataHtml = preg_replace('/<(.[^>]*)>/i', strtolower('<$1>'), $aHead[0]);
        $xTitle = simplexml_import_dom(DomDocument::LoadHtml($sDataHtml));

        return (string)$xTitle->head->title;
    }
    return null;
}

echo getTitle('http://stackoverflow.com/questions/399332/fastest-way-to-retrieve-a-title-in-php');
$title = '';
$dom = new DOMDocument();

if($dom->loadHTMLFile($urlpage)) {
    $list = $dom->getElementsByTagName("title");
    if ($list->length > 0) {
        $title = $list->item(0)->textContent;
    }
}
function get_title($html)
{
    preg_match("/<title(.+)<\/title>/siU", $html, $matches);
    if( !empty( $matches[1] ) ) 
    {
        $title = $matches[1];

        if( strstr($title, '>') )
        {
            $title = explode( '>', $title, 2 );
            $title = $title[1];

            return trim($title);
        }   
    }
}

$html = '<tiTle class="aunt">jemima</tiTLE>';
$title = get_title($html);
echo $title;
function page_title($url) {
  $title = false;
  if ($handle = fopen($url, "r"))  {
    $string = stream_get_line($handle, 0, "</title>");
    fclose($handle);
    $string = (explode("<title", $string))[1];
    if (!empty($string)) {
      $title = trim((explode(">", $string))[1]);
    }
  }
  return $title;
}