PHP节点值和字符计数

PHP节点值和字符计数,php,Php,我有一个字符串变量,其中包含使用fopen()的文本文件(如.html) 接下来我将剥离_tags(),这样我就可以在文章预览中使用未标记的文本,但在此之前,我需要得到h1 nodeValue,并计算它的字符数,这样我就可以用该值替换下面代码中的零,并以150+该值结束 $f = fopen($filepath,"r"); $WholeFile = fread($f, filesize($filepath)); fclose($f); $StrippedFile=strip_tags($Whol

我有一个字符串变量,其中包含使用fopen()的文本文件(如.html) 接下来我将剥离_tags(),这样我就可以在文章预览中使用未标记的文本,但在此之前,我需要得到h1 nodeValue,并计算它的字符数,这样我就可以用该值替换下面代码中的零,并以150+该值结束

$f = fopen($filepath,"r");
$WholeFile = fread($f, filesize($filepath));
fclose($f);
$StrippedFile=strip_tags($WholeFile);
$TextExtract = mb_substr("$StrippedFile", 0,150);
对我来说最好的方式是什么?
解析器就是答案吗?因为这是目前为止唯一的情况,所以我将从html标记中提取值

,如果您确定正在处理的文件的内容,并且知道标题在H1中,那么您可以潜在地切分当前位置获得的字符串
位置(例如,使用
strstr()
,尽管有很多方法可以这样做),分成两个字符串

然后,您可以在第一个标签上剥离标签以获取标题,在第二个标签上剥离标签以获取内容。这是假设您的文件在包含文章内容的dom元素之前只有一个包含标题的h1

请记住,这不是在线解析大量文章的最佳方式,为了获得更通用的解决方案,我将研究一个专用的解析器类

下面是一个代码示例:

代码示例

$f = fopen($filepath,"r");
$WholeFile = fread($f, filesize($filepath));
fclose($f);
// Modified part
$content = strip_tags(strstr($WholeFile, '</h1>'));
$title = strip_tags(strstr($WholeFile, '</h1>', true)); // Valid with PHP 5.3.0 only I think
$TextExtract = mb_substr($content, 0,150);
$f=fopen($filepath,“r”);
$WholeFile=fread($f,filesize($filepath));
外国法郎(f美元);
//修改部分
$content=strip_标签(strstr($WholeFile,');
$title=strip_标签(strstrstr($WholeFile',,true));//我认为只有PHP5.3.0才有效
$TextExtract=mb_substr($content,0150);

当您拥有结构化文本(如HTML、XML、json、YAML等)时,您应该始终使用适当的解析器,除非您有很好的理由不这样做

在这种情况下,您可能可以不使用正则表达式,但您将有一个非常脆弱的解决方案,并且可能会遇到与字符编码、实体或空白相关的问题。以上所有的解决方案都会微妙地断裂。例如,如果您有如下输入:

<html><head><meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>Page title</title></head>
<body><div><h1 title="attributes or the space in the closing tag may confuse code"
>Title &mdash;    maybe emdash counted as 7 characters</h1 >
<p> and      whitespace counted excessively too. And here's
a utf-8 character that may get split in the middle: ©; creating  
an invalid string.</p></div></body></html>
此代码将输出:

”标题-可能emdash被计算为7个字符,而空格也被过度计算。这里有一个utf-8字符,可能会在中间被拆分:)

这里的基本思想是将
h1
(或任何标题元素)与XPath匹配,然后获取该元素和所有后续元素的字符串值,并使用XPath将其截断150个字符。将所有内容保留在XPath中可以避免使用PHP处理的所有混乱的字符集和实体问题。

另外,
“$StrippedFile”
应该是
$StrippedFile
。对于单个变量的情况,引用它是不必要的。这是个坏主意。你会得到很多文章预览的导航链接。我将使用DOM扩展来获取第一个
标记内容,并检查它是否足够长,以便进行良好的文章预览,如果不尝试下一个。我将创建一个对象,它将是第一行标题(以前的h1)和第二行(或更多尚未完成的样式表)的组合内容的前150个字符。还有一个浮动缩略图。整个链接将是文章的单个链接。我想将这些值输入MySQL工作的变量中。非常感谢,我会研究一下,然后发布我将产生的代码。或者问更多的新手问题。我刚刚添加了一个代码示例,应该可以相对快速地尝试您的用例。再次感谢,我对php非常熟悉,我甚至没有想到函数(function))因此,我开始在这些文件上使用单个函数创建“StepVariables”…我现在很惭愧。现在使用它对我来说很有效,但我做了一点修改,我在strstr中插入了另一个strstr($整篇…$true),以防任何文章在标题h1之前以演讲前开头,因为在这种情况下,结果字符串也会包含这个。谢谢你,但到目前为止,我对php非常陌生,而且我正在学习多种语言(我知道这可能看起来很懒),所以任何其他语法都可能会导致我自燃。此外,我的测试文件包含utf-8字符,例如ěšý,上面的runnig脚本返回了其中的150个字符。因为它与我的MySQL没有冲突,所以我现在就解决这个问题。(完成项目的时间有限)提到您最近编辑的帖子,我似乎已经在处理字符集问题。我的第一种(也是项目中唯一的一种)语言需要这样做。如果您使用的是正常的PHP函数,如
substr
,您的脚本最终会损坏字符串。有关PHP unicode的更多信息,请参阅。学习一点DOM和XPath与您在PHP中遇到的问题和需要记住的问题相比,显得有些苍白。我已经遇到了这个困难,因此我使用了unicode友好的mb_substr。尽管我接受您的观点,并将DOM放在我的待办事项列表中。目前看来,这是一个相当令人难以接受的问题,因为我也没有掌握css和javascript。这是一个非常干净的方法来完成这项工作,这绝对是你想要的答案。