Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用html将长文本拆分为摘要和主要部分_Php_Preg Replace_Substr_Strpos - Fatal编程技术网

Php 使用html将长文本拆分为摘要和主要部分

Php 使用html将长文本拆分为摘要和主要部分,php,preg-replace,substr,strpos,Php,Preg Replace,Substr,Strpos,长文本包含一些html标记(br、img等) 此文本需要一个最多400个字符的摘要,并注意单词和html标记,但br标记应替换为空格,以删除摘要中的换行符。看起来好多了 摘要后的文本必须是文本减去摘要,但包含所有html标记和图像br Example text: Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore

长文本包含一些html标记(br、img等)

此文本需要一个最多400个字符的摘要,并注意单词和html标记,但br标记应替换为空格,以删除摘要中的换行符。看起来好多了

摘要后的文本必须是文本减去摘要,但包含所有html标记和图像br

Example text:

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy   eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. <img alt="image" src="/image.jpg"> At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. 
<br /><br />
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. <img alt="image" src="/image.jpg"> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
<br /><br />
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, <img alt="image" src="/image.jpg"> vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet.
问题:

在这个虚拟解决方案中,我遇到了一些问题,因为Trister只包含br,而mainpart包含所有html标记。当char 490周围有图像时,主体部分包含img标记的一半

使用allow for br将_标记剥离到$Trister工作,但我无法从$mainpart中删除精确匹配项

我确信有更好的解决办法。对不起,我犯了英语错误,请不要否决我。我尽了最大的努力解释它


非常感谢您抽出时间来帮助我。

好的,所以我修补了这个,我想我可能有一些东西对您有用

如果您的字符串是这样的:

$string = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy   eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. <img alt="image" src="/image.jpg"> At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. 
<br /><br />
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. <img alt="image" src="/image.jpg"> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
<br /><br />
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, <img alt="image" src="/image.jpg"> vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet.';
preg_match('~([A-z0-9 ,.]|<.*?>){1,158}(?=\s+)~', $string, $matches, PREG_OFFSET_CAPTURE);
Array
(
    [0] => Array
        (
            [0] => Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy   eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua
            [1] => 0
        )

    [1] => Array
        (
            [0] => a
            [1] => 155
        )

)
在我有
{1158}
的地方,您可以将
158
更改为您的摘要长度。字符数不会精确到400或500,但应该在该数字左右。例如,如果您有HTML标记,它们将占用更多的空间,并且将只作为我们的字符之一计算。(因为我告诉它要么给我一个字符,要么给我一个HTML标记——158次。)

$matches
将包含和数组如下:

$string = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy   eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. <img alt="image" src="/image.jpg"> At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. 
<br /><br />
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. <img alt="image" src="/image.jpg"> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
<br /><br />
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, <img alt="image" src="/image.jpg"> vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet.';
preg_match('~([A-z0-9 ,.]|<.*?>){1,158}(?=\s+)~', $string, $matches, PREG_OFFSET_CAPTURE);
Array
(
    [0] => Array
        (
            [0] => Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy   eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua
            [1] => 0
        )

    [1] => Array
        (
            [0] => a
            [1] => 155
        )

)
因此,我们希望文本使用
$matches[0][0]
,停止位置使用
$matches[1][1]

现在,让我们利用我们掌握的信息,定义一些我们以后可以使用的变量:

$teaser = $matches[0][0];
$capture_position = $matches[1][1] + 1;
$body = substr($string, $capture_position); 
请注意,我们将
$matches[1][1]
增加1,因为我们希望以匹配后的字符开始。。。没有匹配最后一个字符

接下来,我们使用
substr
定义了
$body
,以仅获取从
$capture\u位置开始的文本

最后,我们可以打印出我们的
$trister
(带有
strip_标签
)和
$body

print '<b>'.strip_tags($teaser).'</b>';
print '<br><br>'.$body;
print.''带标签($trister.'';
打印“

”.$body;
下面是一个工作演示:

下面是一个正则表达式供您使用,看看更改
158
如何影响您捕获的总字符串:

解释
([A-z0-9,.]|){1158}(?=\s+)

  • ([A-z0-9,.]|)
    这是一个捕获组
    (…)
    ,将包含我们的摘要,由两个项目组成。第一个是字符类
    […]
    ,由大小写字母
    a-z
    、数字
    0-9
    、空格
    、逗号
    和句点
    组成。管道
    |
    是一个“或”符号。第二项正在查找小于号
    。应该匹配任何HTML标记
  • {1158}
    这是一个范围,由
    1
    的起始编号和经过
    158
    定义。所有这一切意味着,无论我们在它之前匹配了什么(字符或html标记),都应该至少找到一次,但最多可以找到158次
  • (?=\s+
    这是一个前瞻性的
    (?=…)
    ,表示在匹配后应至少找到一次空白字符
    \s

对于摘要,在substr之前使用strip_标记,但是如果摘要不再有html标记,但主要部分应该有,我无法从主要文本中替换摘要部分,因为没有匹配项。这是我发现的关于截断文本和html的内容:您做了很好的解释。让我看看我能为你想出什么。非常感谢你花时间和精力帮助我解决这个问题。我试过了,只要断点上没有html标记,它就可以工作。当添加一个Hmmm时,好吧,我在复制你的问题时遇到了困难,但是,你可以在“或”部分添加一些东西。就像您可以添加
|。*?
作为第三个选项一样。这将通过关闭链接标记查找打开链接标记。这就是整件事,
([A-z0-9,.]| |.*){1222}(?=\s+)
我不明白这是怎么回事。以这个示例文本为例:$string='Lorem ipsum dolor sit amet,consetetur sadipscing elitr,sed diam nonumy eirmod tempor invidunt ut laboure et dolore magna aliquyam erat,sed diam voluptua.';将数字设置为200,然后查看html。