跳到:
内容

BuddyPress.org网站

开的9年前

关闭9年前

上次修改时间9年前

#6517 关闭 缺陷(bug) (固定的)

bp_create_excrpt返回mall-formed标记-mbstrlen问题?

报告人: hnla简介 hnla公司 所有者: 布内博格斯的简介 布内博格斯
里程碑: 2.3.3 优先: 正常的
严重程度: 正常的 版本:
组件: 核心 关键词: has-patch接口 需求-测试
复写的副本:

说明

直到最近,这个BP函数还很成功地将一段post-post_content包装在wp_ksses中,然后将其包装在wpauto中,并使用截断长度和BP参数数组删除省略号。这是为了通过附加的allowed_tags获得对特定内容块的更多控制。

这种安排突然导致$length被忽略,全部内容被返回,并且在内容末尾出现了杂乱的结束标记(出现标记元素即锚定时产生的结果)

我重新设计了删除wp_ksse的方法,因为我们最近升级了BP允许的标记,所以没有必要删除wpauto,以便稍后在返回的摘录中使用(很好)。

问题仍然存在,链接是mallformed的,我们试图在函数中收集/剥离标记,以便从字符/字符串长度计数中删除,但我们未能正确返回它们,这可能导致outfinalforeach结束标记循环失败。

这感觉可能是mb_strlen的问题,因为我在另一张票据中看到过它,Boone暗示WP可能在这里做了一些更改?

单元测试是一种演示问题的方法,但遗憾的是,没有编写测试的经验,这将不得不等待。

我当前的测试位于运行新wp_query的Archive post循环中:
bp_create_except($this_cat_news->post->post_content,300,数组('ending'=>'','html'=>true))

文章内容在文章正文中有一组简单的基本锚链接。

附件(5)

6517.差异(2.6 KB)-由添加布内博格斯 9年前.
摘录问题.jpg(37.5 KB)-由添加丹布 9年前.
摘录1.jpg(57.2 KB)-由添加丹布 9年前.
节选2.jpg(78.9 KB)-由添加丹布 9年前.
6517.2.diff(如果)(4.6 KB)-由添加布内博格斯 9年前.

将所有附件下载为:.zip文件

更改历史记录(39)

#1 @hnla公司
9年以前

此外,我们承认Cake是功能的来源,但phpdocs链接似乎已经过时:

http://book.cakephp.org/view/1469/Text#truncate-1625

我能找到的最佳匹配是:

http://book.cakephp.org/3.0/en/core-libraries/text.html截断-文本

#2 @布内博格斯
9年以前

hnla-你能分享一些演示问题的示例内容吗?

#3 @hnla公司
9年以前

我将尝试编写一个小函数来单独演示这个问题。

#4 @hnla公司
9年以前

这应该说明了问题,我一直在尝试各种标记组合,链接被评论为显示了不应该是“/a”的链接字符,但它们只是从字符计数中剥离后错误的角度标记重新引入的结果,我认为这个链接扩展到了整个段落或返回的摘录的末尾,所以在遇到理想情况时会出现问题。

函数bp_excert_truption_issue_trac6517(){$test_content='<p>此测试内容演示了一个问题通过截断通过bpcreate_excrpt函数运行的长字符串,该函数包含pcdata</p><p>当我们要处理标记时,问题就出现了(注意函数中删除字符的html参数表示从截断的字符串长度返回的解析数据标记)<i>需要注意的是,我们现在在文本的末尾有一些游离的闭合尖括号</i></p>如果我们现在将链接标记添加到内容正文中,我们将看到格式错误的标记导致文本的包装不正确。我们现在链接到<a href=“http://buddypress.org/“>网络上的一些网站真的很可怕现在看起来有点奇怪http://google.com/“>当我将另一个链接添加到组合中时在链接中包含部分结束锚标记,但不包含小于尖括号。<p>问题是什么?显然是错误地返回了标记字符去掉循环后,计数停止了?末端有一个链接<a href=“http://https://buddypress.trac.wordpress.org/ticket/6517#评论:3“>到火车票包含部分链接标记字符的中断</p>';$excurpt_test=bp_create_excurpt($test_content,350,数组('ending'=>'','html'=>true));echo$extract_test;}

#5 @hnla公司
9年以前

如果事实上我将html参数更改为false,即计算摘录长度中的html标记然后,我们通过避免通过mbstrlen函数剥离tags并返回正确的摘录来避免这个问题。

另一方面,很明显,这段文字来自互联网的黑暗时代,正如这句话所强调的:
preg_match('/img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param/s)

HTML 3.0:秒

因此,转储$openTags会导致:
数组(7){[0]=>string(1)“p”[1]=>string(2)“a”[2]=>字符串(2)

然后,我们提出这些问题并做到:
'</' . $标签。“>”

很明显,这是错误的,也是为什么我们要将闭合角括号加倍的原因。

[2] =>字符串(2)“a>”

'</' . 'a> “.”>“有效。

还看不出其中的什么地方,我们把$openTag搞砸了,很难理解preg_match的东西。

上次编辑时间9年前通过hnla公司(以前的)(差异)

#6 @hnla公司
9年以前

@boone问题是修订版9523

bp_创建摘要(),在从计数中排除HTML时识别HTML注释。

除其他外,这可以防止出现以下问题:<!--更多-->标记在
活动流。

修复#3680

将更改还原到preg_match_all行可以更正附加的右括号。

#7个 @布内博格斯
9年以前

  • 里程碑已从更改等待审查2.4

谢谢你帮我查了一下,hnla。似乎有两个问题。首先,正则表达式在[9523]使标记检查过于宽松,结果检测到一些大于所需的块。第二个是精确=假逻辑确保字符串只在单词边界上被截断,它没有区分作为单词边界的空间和出现在HTML标记内部的空间。也就是说,在截断时Foo<a href=“http://example.com“>酒吧具有精确=假,我们不应该在href公司.

请测试6517.差异看看它是否解决了你的问题。谢谢!

#8 @赫纳
9年以前

是的,我怀疑单词边界方面在事情中发挥了作用,但无法进一步测试,我对其他活动摘录媒体有问题,我必须追踪,然后我将测试此补丁并进行报告。

顺便说一句,我想知道我们对更多的标签或html注释实际上做了什么,同样还没有实际测试,看我们是否将它们去掉,或者作为其他标记返回它们,在注释的情况下,返回它们是没有意义的?

#9 @hnla公司
9年以前

@布恩:
经过测试的补丁,使用html true/false测试字符数,这似乎很好,将计数更改为包括标记标记或从$length中排除标记。

然而,看起来我们已经失去了$exact作为一个数组选项——它应该是默认的false,但似乎停留在true上。

#10 @布内博格斯
9年以前

谢谢你的测试,hnla。的单元测试准确的仍在通过-你能告诉我你在做什么来测试吗?

#11个 @丹布
9年以前

最近在论坛.

尝试在新安装上复制,问题得到确认。请参见屏幕截图。

我应用了6517.diff解决了这个问题。

@丹布
9年以前

#12 @布内博格斯
9年以前

  • 里程碑已从更改2.42.3.3

谢谢danbp。由于这是在2.3.0中引入的,我将在2.3分支上修复此问题。

#13 @hnla公司
9年以前

@布恩

你能告诉我你在做什么来测试这个吗?

确定count和html选项按预期工作,并返回以中间单词结尾的截断,然后在选项“exact”中添加=>false($text不会被截断中间单词),我希望看到截断扩展到包括单词直到下一个空格点?

现在我想知道这是否是一个有效的期望,然而,$html true/false和$act true/falce的组合是什么,当我在20个字符或21/22之间切换时,我无法演示完整的单词。

#14 @布内博格斯
9年以前

bp_创建摘要()四舍五入。即:

bp_create_excrpt('foo bar baz',5,数组('exact'=>true));//“foo ba”bp_create_excrpt('foo bar baz',5,数组('exact'=>false));//“foo”

唯一的例外是,第一个单词太长,导致字符串为零。请参阅#6254.

那与你看到的相符吗?

#15 @hnla公司
9年以前

是的,您的测试用例是有效的(好的,所以需要四舍五入,确实如此)

但是现在添加一个锚到组合中,因为当前该测试用例没有覆盖所有烫发
$totalLength==18

bp_create_excrpt('foo<a>bar</a>baz',5,数组('exact'=>true,'html'=>false));//“html”为false,因此包含标记计数//“exact”为true,因此返回文字字符串长度//返回“foo<”//结果将解析后的标记作为字符数据返回。//结果与预期不符?//如果在count中包含标记,我们需要从字符的文本计数中剥离标记//以免我们不经意地落在那部分加价上?
bp_create_excrpt('foo<a>bar</a>baz',5,数组('exact'=>true,'html'=>true));//返回“foo b”//结果符合预期;需要的5个字符“exact”为true,标记从计数中删除//所以,我们已经呈现了第二个单词的第一个字符(虽然包装在它的锚中!)
bp_create_excrpt('foo<a>bar</a>baz',6,数组('exact'=>false,'html'=>false));//返回“foo”//“html”为false,因此包含标记计数//“exact”为假,所以不要删掉中间单词//结果符合预期;6个字符计数到“<a”结果向下取整到第一个单词边界结束。

#16 @hnla公司
9年以前

魔鬼有史以来最大的诡计是让世界相信reg表达式很酷

#17 @丹布
9年以前

一如既往,魔鬼细节!(几个小时后与regex面对面学习)

#18个 @布内博格斯
9年以前

魔鬼有史以来最大的诡计是让世界相信reg表达式很酷

当正则表达式实际上是问题的一部分时,不要轻视它:)

bp_create_excrpt('foo<a>bar</a>baz',5,数组('exact'=>true,'html'=>false));//“html”为false,因此包含标记计数//“exact”为true,因此返回文字字符串长度//返回“foo<”//结果将解析后的标记作为字符数据返回。//结果不符合预期?//如果在count中包含标记,我们需要从字符的文本计数中剥离标记//以免我们不经意地落在那部分加价上?

不,我认为这是不正确的。html=假意味着输入应该被视为一个简单的字符串-我们不应该对它进行任何解析精确=真具有html=假,这是他们的特权。我可以想象有人可能想使用此函数来获取精确长度的摘录(原因不是显示在网页中)。

#19 @布内博格斯
9年以前

  • 所有者设置为布内博格斯
  • 分辨率设置为固定的
  • 状态已从更改新的关闭

9962:

改进的HTML处理逻辑bp_创建摘要().

  • 检测标记的正则表达式应该更宽松,以避免错误匹配。
  • 单词边界检测,当精确=假,不应在HTML标记内返回空格字符(例如<a href=“http://example.com">).

这些更改修复了中引入的一些标记传递问题[9523].

修复#6517.

#20个 @hnla公司
9年以前

如果开发人员选择将exact=true与html=false相结合,这是他们的特权

我有一种感觉,你可能会这么说,并且有点不得不同意,但这通常是我对人们的苛刻态度,当我厌倦了做一些白痴证明:)

然而,不确定“暗示”是否正确,为什么我们可以选择是否计数标记?字符串是唯一重要的计数,如果存在标记,则应始终将其视为不显示的解析数据,因此不属于计数的一部分,如果是这样,则函数会变得更简单?

我可以想象有人可能想使用此函数来获取精确长度的摘录(原因不是显示在网页中

当然,如果需要的话,也有更简单的php函数来计算字符串,但是嘿,只要我们很高兴它能正常工作,我们希望开发人员/用户不要将这两个选项一起传递来计算所有字符串并显示精确值&这对我来说很有用!

上次编辑时间9年前通过hnla公司(以前的)(差异)

#21 @布内博格斯
9年以前

该函数的目的是创建摘录。如果有人想创建表单摘要foo<a[&hellip;],我们没有理由阻止它发生。虽然确实有人可以简单地使用substr()为了创建一个“准确”的摘录,他们可能正在使用bp_创建摘要()作为更大系统的一部分,并希望具有一致的接口。

#22 @布内博格斯
9年以前

9963:

改进的HTML处理逻辑bp_创建摘要().

  • 检测标记的正则表达式应该更宽松,以避免错误匹配。
  • 单词边界检测,当精确=假,不应在HTML标记内返回空格字符(例如<a href=“http://example.com">).

这些更改修复了中引入的一些标记传递问题[9523].

合并[9962]到2.3分支进行2.2.3。

修复#6517.

#23 @丹布
9年以前

  • 分辨率 固定的删除
  • 状态已从更改关闭重新打开的

应用补丁后,一个新的问题开始于摘录。

当你发布的文本超出了更新、主题或评论的摘录限制时,除了3个点之外,没有其他文本出现,请阅读更多信息。您必须单击“阅读更多”才能查看全部内容。令人恼火的是,如果最初没有显示摘录。

如果文本低于限制,则一切正常。

这张票是在松弛danbp的#buddypress。查看日志.


9年以前

#25 @布内博格斯
9年以前

danbp-你能给出具体的复制步骤吗,包括示例?我的测试和自动化测试表明,该功能并没有像您所说的那样完全损坏:)

#26 @丹布
9年以前

@布内博格斯,

我花了点时间才把这个整理好,很抱歉回答得太晚了。

当你插入长文本时,你应该会看到一个摘录和[阅读更多]按钮。

当您插入Lorem Ipsum文本时,您得到了正确的摘录输出。

当你插入像法语这样的重音文本时,整个摘录都会被剥离,你只能看到。。。[阅读更多]

请参见所附图像。

图1显示了3项活动。
1) 拉丁文的正确摘录。
2) 超出例外限制的正确文本,法语
3) 相同的文本,稍长一点,带有空摘录

图2是相同的活动,部署了第三个活动。

你可以通过插入一段长的拉丁语文本来重现这一点。

Est@dan et velit dolores eos准加速。假设asperiores suscipit corrupti ut provident different quia。Dolores enim qui pursedus natus公司。Earum volptas est explicabo et.Neque at dolorum cumque(多洛伦坎克)。如果是定量的,那么就需要定量的定量。Porro deleniti doloremque quaerat在aut指控中。Eligendi possimus similique nesciount卷已发布。Ab aut fuga volptas quis illo(阿布奥特·福加·伏尔普塔斯·奎斯·伊洛)。Eos ipsum est et Eos amet tempore。

还有一篇很长的法语文本

Toutes les connaissances que les hommes avient mis sur Internet luiétaient可访问。Les grandes bibliothèques du monde entier n’avaient和de secret pour lui。伊尔普瓦伊特(Il pouvait)逮捕了特雷斯·维特(très vite)、博阿库奇(beaucoup)和维特·奎恩·恩·库曼(vite que n'importe quel humain)。Il avait appris兜售整个世界的内幕消息,游客则付钱。C'est lui qui avait fait en sort qu’Internet sedéploie ainsi(互联网服务策略)。
上次编辑时间9年前通过丹布(以前的)(差异)

@丹布
9年以前

@丹布
9年以前

#27 @布内博格斯
9年以前

  • 关键词 has-patch接口 需求-测试补充

非常感谢你提供的细节,丹布。6517.2.diff(如果)是对前面逻辑的改进,通过单元测试表明它在重音字符上的工作符合预期。我可以请你(和其他人)试试吗?

#28 @hnla公司
9年以前

发现发布的文本块有问题(使用默认参数运行摘录函数),并且只返回第一个单词的摘录以及$ending。

6517.2补丁程序已经澄清了up摘录似乎工作正常,可以接受和返回重音字符。

但不确定丹麦石油公司是否仍然看到了问题。

#29 随访: @布内博格斯
9年以前

发现发布的文本块有问题(使用默认参数运行摘录函数),并且只返回第一个单词的摘录以及$ending。

是 啊。中出现错误[9963]这有点把字符串翻了个底朝天。(我必须从字符串的末尾向后看,才能找到最后一个单词的边界,但我忘了在截断之前改变方向。)我的测试编写方式没有正确解释这一点。我认为这很大程度上是danbp的问题——它实际上并不是关于重音字符,而是关于只有当字符串包含标记时才会出现错误的事实。不管怎样,丹伯,如果可以的话,请看一看。

#30 答复: 29 @丹麦石油公司
9年以前

回复布内博格斯:

这实际上并不是关于重音字符,而是关于错误仅在字符串包含标记时出现的事实。不管怎样,丹伯,如果可以的话,请看一看。

仅供参考,当您输入我以前的法语文本并添加`一些文本`(用代码按钮)到了它的一部分,摘录出现了!

我申请了6517.2,问题解决了。看起来目前工作正常。

谢谢您!

#31 @布内博格斯
9年以前

  • 分辨率设置为固定的
  • 状态已从更改重新打开的关闭

9967:

不断的冒险bp_创建摘要().

此变更集修复了中引入的错误[9963]导致摘录
在某些情况下,截断太多。它还修复了一些潜在的问题
多字节字符串html=真.

修复#6517.

#32 @布内博格斯
9年以前

9968:

不断的冒险bp_create_except()(创建异常).

此变更集修复了中引入的错误[9963]这使得摘录
在某些情况下,截断太多。它还修复了一些潜在的问题
多字节字符串html=真.

合并[9967]至2.3.3的2.3分支。

修复#6517.

#33 @丹布
9年以前

谢谢你的快速修复,Boone!

#34 @布内博格斯
9年以前

拜托!

注:请参见TracTickets公司有关使用的帮助门票。