如何截断 php 中的字符串的一部分

how to truncate part of a string in php

例如我有这样的文字

<p>
Quis vel accusantium libero. Suscipit officiis culpa
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7">
libero quia ad.
</p>

我想检查字符串是否有任何 data:image 然后只截断这部分所以最大字符为 50,所以结果变成

<p>
Quis vel accusantium libero. Suscipit officiis culpa
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH...">
libero quia ad.
</p>

我不确定如何使用 preg_replace"data:image.+?" 模式

您可以通过不同的方式做到这一点,例如 preg_match(_all)、preg_split

但是 preg_replace 会像这样工作:run to see

<?php
$text='data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
$result=preg_replace('/(?<=data:image.{50}).*/', '', $text);

echo $result;

问题:PHP 字符串解析

  • 感谢您通过评论澄清您的问题。您似乎想要的是一个 通用 HTML 解析器,它可以对 HTML 标记进行特殊情况修改。
  • 一般来说,is not advisable to use regex to parse HTML
  • 如果您想要一个 通用 工具(而不是一种快速而肮脏的方法)那么已经有一个关于 Modifying html attributes with PHP 的问题可能更接近到你想要的。
  • 如果您想要的只是一种快速而简单的方法,它将从 img 标签的 src 属性中删除长的 base64 编码数据,那么您可以标记原始 HTML 字符串,然后执行正则表达式替换,但如果您决定要进行其他修改,这种方法将很痛苦。当您本可以使用真正的 HTML 解析器开始时,您可能最终会重新发明轮子。
  • 然而,下面的方法就是这样做的,对字符串进行标记,进行替换,然后 return 整个修改后的字符串。

使用 preg_replace 的解决方案(快速而简单)

<?php

$demostring = '
<p>
Quis vel accusantium libero. Suscipit officiis culpa
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7">
libero quia ad.
</p>
';

function ctf0_truncate($vinput){
  return( preg_replace('/(data:image.{50})(.*)/', '', $vinput) );
}

function ctf0_parse($text, $chars = 50) {
  if (strpos($text, 'data:image') !== FALSE){
    $tokens = explode('"',$text);
    $tokens = array_map("ctf0_truncate",$tokens);
    $vout   = implode('"',$tokens);
  } elseif( True ) {
    $vout = $text;
  }
  return $vout;
}

$myresult = ctf0_parse($demostring);
print($myresult);

输出结果

<p>
Quis vel accusantium libero. Suscipit officiis culpa
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALA">
libero quia ad.
</p>

备注

  • 上述解决方案省略了问题的请求元素。具体来说,如何添加“...”省略号。对于那部分,请查看关于 SO 的其他答案,例如 here and here.