使用 PHP 将 HTML 页面转换为纯文本
Convert HTML Page to Plain Text using PHP
更准确地说,我需要能够剥离 HTML 标签,就像这个脚本一样好:zubrag.com/tools/html-tags-stripper.php
我需要能够在我的本地主机(xampp 服务器)上使用任何 url 执行此操作,但现在我想使用此 url 从中删除标签,因为这是最混乱的是:http://static.anaf.ro/static/10/Timis/Timis.htm
我拥有的不起作用,我不知道为什么或如何修复它。
这是代码来自:nadeausoftware.com/articles/2007/09/php_tip_how_strip_html_tags_web_page
我已经在代码中添加了这一行,但是还是不行...
$text = file_get_contents('http://static.anaf.ro/static/10/Timis/Timis.htm');
下面是原始代码(请注意,原始代码没有上面的行。那行是我添加的)
/**
* Copyright (c) 2008, David R. Nadeau, NadeauSoftware.com.
* All rights reserved.
* See:
* http://nadeausoftware.com/articles/2007/09/php_tip_how_strip_html_tags_web_page
*/
$text = file_get_contents('http://static.anaf.ro/static/10/Timis/Timis.htm');
function strip_html_tags( $text )
{
// PHP's strip_tags() function will remove tags, but it
// doesn't remove scripts, styles, and other unwanted
// invisible text between tags. Also, as a prelude to
// tokenizing the text, we need to insure that when
// block-level tags (such as <p> or <div>) are removed,
// neighboring words aren't joined.
$text = preg_replace(
array(
// Remove invisible content
'@<head[^>]*?>.*?</head>@siu',
'@<style[^>]*?>.*?</style>@siu',
'@<script[^>]*?.*?</script>@siu',
'@<object[^>]*?.*?</object>@siu',
'@<embed[^>]*?.*?</embed>@siu',
'@<applet[^>]*?.*?</applet>@siu',
'@<noframes[^>]*?.*?</noframes>@siu',
'@<noscript[^>]*?.*?</noscript>@siu',
'@<noembed[^>]*?.*?</noembed>@siu',
// Add line breaks before & after blocks
'@<((br)|(hr))@iu',
'@</?((address)|(blockquote)|(center)|(del))@iu',
'@</?((div)|(h[1-9])|(ins)|(isindex)|(p)|(pre))@iu',
'@</?((dir)|(dl)|(dt)|(dd)|(li)|(menu)|(ol)|(ul))@iu',
'@</?((table)|(th)|(td)|(caption))@iu',
'@</?((form)|(button)|(fieldset)|(legend)|(input))@iu',
'@</?((label)|(select)|(optgroup)|(option)|(textarea))@iu',
'@</?((frameset)|(frame)|(iframe))@iu',
),
array(
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
"\n$0", "\n$0", "\n$0", "\n$0", "\n$0", "\n$0",
"\n$0", "\n$0",
),
$text );
// Remove all remaining tags and comments and return.
echo strip_tags( $text );
}
它工作正常,但是 post 中 link 的正则表达式不起作用。它没有 return 正确的字符集,所以试试这个:
function strip_html_tags( $text )
{
$text = preg_replace(
array(
// Remove invisible content
'@<head[^>]*?>.*?</head>@siu',
'@<style[^>]*?>.*?</style>@siu',
'@<script[^>]*?.*?</script>@siu',
'@<object[^>]*?.*?</object>@siu',
'@<embed[^>]*?.*?</embed>@siu',
'@<applet[^>]*?.*?</applet>@siu',
'@<noframes[^>]*?.*?</noframes>@siu',
'@<noscript[^>]*?.*?</noscript>@siu',
'@<noembed[^>]*?.*?</noembed>@siu',
// Add line breaks before and after blocks
'@</?((address)|(blockquote)|(center)|(del))@iu',
'@</?((div)|(h[1-9])|(ins)|(isindex)|(p)|(pre))@iu',
'@</?((dir)|(dl)|(dt)|(dd)|(li)|(menu)|(ol)|(ul))@iu',
'@</?((table)|(th)|(td)|(caption))@iu',
'@</?((form)|(button)|(fieldset)|(legend)|(input))@iu',
'@</?((label)|(select)|(optgroup)|(option)|(textarea))@iu',
'@</?((frameset)|(frame)|(iframe))@iu',
),
array(
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
"\n$0", "\n$0", "\n$0", "\n$0", "\n$0", "\n$0",
"\n$0", "\n$0",
),
$text );
return strip_tags( $text );
}
/* Read an HTML file */
$raw_text = file_get_contents('http://static.anaf.ro/static/10/Timis/Timis.htm');
/* Get the file's character encoding from a <meta> tag */
preg_match("/<meta[^>]+charset=['\"]?(.*?)['\"]?[\/\s>]/i", $raw_text, $matches );
$encoding = $matches[1];
/* Convert to UTF-8 before doing anything else */
$utf8_text = iconv( $encoding, "utf-8", $raw_text );
/* Strip HTML tags and invisible text */
$utf8_text = strip_html_tags( $utf8_text );
/* Decode HTML entities */
$utf8_text = html_entity_decode( $utf8_text, ENT_QUOTES, "UTF-8" );
echo $utf8_text;
我改变了什么:
为了获得正确的字符集,我简单地替换了这个
/* Get the file's character encoding from a <meta> tag */
preg_match( '@<meta\s+http-equiv="Content-Type"\s+content="([\w/]+)(;\s+charset=([^\s"]+))?@i', $raw_text, $matches );
$encoding = $matches[3];
有了这个
preg_match("/<meta[^>]+charset=['\"]?(.*?)['\"]?[\/\s>]/i", $raw_text, $matches );
$encoding = $matches[1];
编辑 1:
猜想网站上的脚本在从您提供的 URL 中剥离标签时确实存在一些问题。它显示了很多 A。我想去除标签的最好方法就是去除开始 < 和第一个结束 > 之间的所有内容。但我目前对正则表达式没有任何想法,也许 google 可以帮助:)
更准确地说,我需要能够剥离 HTML 标签,就像这个脚本一样好:zubrag.com/tools/html-tags-stripper.php
我需要能够在我的本地主机(xampp 服务器)上使用任何 url 执行此操作,但现在我想使用此 url 从中删除标签,因为这是最混乱的是:http://static.anaf.ro/static/10/Timis/Timis.htm
我拥有的不起作用,我不知道为什么或如何修复它。 这是代码来自:nadeausoftware.com/articles/2007/09/php_tip_how_strip_html_tags_web_page
我已经在代码中添加了这一行,但是还是不行...
$text = file_get_contents('http://static.anaf.ro/static/10/Timis/Timis.htm');
下面是原始代码(请注意,原始代码没有上面的行。那行是我添加的)
/**
* Copyright (c) 2008, David R. Nadeau, NadeauSoftware.com.
* All rights reserved.
* See:
* http://nadeausoftware.com/articles/2007/09/php_tip_how_strip_html_tags_web_page
*/
$text = file_get_contents('http://static.anaf.ro/static/10/Timis/Timis.htm');
function strip_html_tags( $text )
{
// PHP's strip_tags() function will remove tags, but it
// doesn't remove scripts, styles, and other unwanted
// invisible text between tags. Also, as a prelude to
// tokenizing the text, we need to insure that when
// block-level tags (such as <p> or <div>) are removed,
// neighboring words aren't joined.
$text = preg_replace(
array(
// Remove invisible content
'@<head[^>]*?>.*?</head>@siu',
'@<style[^>]*?>.*?</style>@siu',
'@<script[^>]*?.*?</script>@siu',
'@<object[^>]*?.*?</object>@siu',
'@<embed[^>]*?.*?</embed>@siu',
'@<applet[^>]*?.*?</applet>@siu',
'@<noframes[^>]*?.*?</noframes>@siu',
'@<noscript[^>]*?.*?</noscript>@siu',
'@<noembed[^>]*?.*?</noembed>@siu',
// Add line breaks before & after blocks
'@<((br)|(hr))@iu',
'@</?((address)|(blockquote)|(center)|(del))@iu',
'@</?((div)|(h[1-9])|(ins)|(isindex)|(p)|(pre))@iu',
'@</?((dir)|(dl)|(dt)|(dd)|(li)|(menu)|(ol)|(ul))@iu',
'@</?((table)|(th)|(td)|(caption))@iu',
'@</?((form)|(button)|(fieldset)|(legend)|(input))@iu',
'@</?((label)|(select)|(optgroup)|(option)|(textarea))@iu',
'@</?((frameset)|(frame)|(iframe))@iu',
),
array(
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
"\n$0", "\n$0", "\n$0", "\n$0", "\n$0", "\n$0",
"\n$0", "\n$0",
),
$text );
// Remove all remaining tags and comments and return.
echo strip_tags( $text );
}
它工作正常,但是 post 中 link 的正则表达式不起作用。它没有 return 正确的字符集,所以试试这个:
function strip_html_tags( $text )
{
$text = preg_replace(
array(
// Remove invisible content
'@<head[^>]*?>.*?</head>@siu',
'@<style[^>]*?>.*?</style>@siu',
'@<script[^>]*?.*?</script>@siu',
'@<object[^>]*?.*?</object>@siu',
'@<embed[^>]*?.*?</embed>@siu',
'@<applet[^>]*?.*?</applet>@siu',
'@<noframes[^>]*?.*?</noframes>@siu',
'@<noscript[^>]*?.*?</noscript>@siu',
'@<noembed[^>]*?.*?</noembed>@siu',
// Add line breaks before and after blocks
'@</?((address)|(blockquote)|(center)|(del))@iu',
'@</?((div)|(h[1-9])|(ins)|(isindex)|(p)|(pre))@iu',
'@</?((dir)|(dl)|(dt)|(dd)|(li)|(menu)|(ol)|(ul))@iu',
'@</?((table)|(th)|(td)|(caption))@iu',
'@</?((form)|(button)|(fieldset)|(legend)|(input))@iu',
'@</?((label)|(select)|(optgroup)|(option)|(textarea))@iu',
'@</?((frameset)|(frame)|(iframe))@iu',
),
array(
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
"\n$0", "\n$0", "\n$0", "\n$0", "\n$0", "\n$0",
"\n$0", "\n$0",
),
$text );
return strip_tags( $text );
}
/* Read an HTML file */
$raw_text = file_get_contents('http://static.anaf.ro/static/10/Timis/Timis.htm');
/* Get the file's character encoding from a <meta> tag */
preg_match("/<meta[^>]+charset=['\"]?(.*?)['\"]?[\/\s>]/i", $raw_text, $matches );
$encoding = $matches[1];
/* Convert to UTF-8 before doing anything else */
$utf8_text = iconv( $encoding, "utf-8", $raw_text );
/* Strip HTML tags and invisible text */
$utf8_text = strip_html_tags( $utf8_text );
/* Decode HTML entities */
$utf8_text = html_entity_decode( $utf8_text, ENT_QUOTES, "UTF-8" );
echo $utf8_text;
我改变了什么:
为了获得正确的字符集,我简单地替换了这个
/* Get the file's character encoding from a <meta> tag */
preg_match( '@<meta\s+http-equiv="Content-Type"\s+content="([\w/]+)(;\s+charset=([^\s"]+))?@i', $raw_text, $matches );
$encoding = $matches[3];
有了这个
preg_match("/<meta[^>]+charset=['\"]?(.*?)['\"]?[\/\s>]/i", $raw_text, $matches );
$encoding = $matches[1];
编辑 1: 猜想网站上的脚本在从您提供的 URL 中剥离标签时确实存在一些问题。它显示了很多 A。我想去除标签的最好方法就是去除开始 < 和第一个结束 > 之间的所有内容。但我目前对正则表达式没有任何想法,也许 google 可以帮助:)