如何截断 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.
例如我有这样的文字
<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.