欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

关于preg_replace非常不解的事情?

程序员文章站 2022-05-15 19:28:37
...
$thumbMark = '200x200';$thumb =$r['thumb'];echo $r['thumb'].'
'; // http://img2.com.cn/images/2014/038/422/14058002224830.9000001763_100x100.jpg //$thumb='http://img2.com.cn/images/2014/038/422/14058002224830.9000001763_100x100.jpg';$r['thumb'] = preg_replace('/_\d+x\d+/', '_' . $thumbMark,$thumb);echo $r['thumb'].'
'; // http://img2.com.cn/images/2014/038/422/14058002224830.9000001763_100x100.jpg


为何上述的替换函数无效,而如下给“$thumb”直接赋值,却能正常替换?

$thumbMark = '200x200';$thumb =$r['thumb'];echo $r['thumb'].'
'; // http://img2.com.cn/images/2014/038/422/14058002224830.9000001763_100x100.jpg$thumb='http://img2.com.cn/images/2014/038/422/14058002224830.9000001763_100x100.jpg';$r['thumb'] = preg_replace('/_\d+x\d+/', '_' . $thumbMark,$thumb);echo $r['thumb'].'
'; // http://img2.com.cn/images/2014/038/422/14058002224830.9000001763_200x200.jpg




回复讨论(解决方案)

var_dump($r['thumb']);
贴出结果

var_dump($r['thumb']);
贴出结果


string(85) "http://img2.com.cn/images/2014/038/422/14058002224830.9000001763_100x100.jpg"

块代码如:

while ($r = $db->fetch_array($result)) {
$r['adddate'] = timetodate($r['addtime'], 5);
$r['editdate'] = timetodate($r['edittime'], 5);

if ($lazy && isset($r['thumb']) && $r['thumb']) {
$thumbMark = '100x100';
if ($list == 1) {
$thumbMark = '200x200';
}
$thumb =$r['thumb'];
var_dump($r['thumb']);
//echo $r['thumb'].'
'; // http://img2.com.cn/images/2014/038/422/14058002224830.9000001763_100x100.jpg
//$thumb='http://img2.com.cn/images/2014/038/422/14058002224830.9000001763_100x100.jpg';
$r['thumb'] = preg_replace('/_\d+x\d+/', '_' . $thumbMark,$thumb);
//echo $r['thumb'].'
';


}

…………
}

检查 $list 的值

检查 $list 的值

if ($list == 1) {
$thumbMark = '200x200';
echo 'list:'.$list; // list:1
}

正常

没想到刚接触PHP就碰到怪问题了,难道是环境的问题?

发现一点端倪了,将正则“/_\d+x\d+/”中间的x去除之后,能正常替换,输出“http://img2.com.cn/images/2014/038/422/14058002224830.9000001763_200x200x100.jpg”;

真是太奇怪了,这个“x”到底招谁惹谁了?

发现一点端倪了,将正则“/_\d+x\d+/”中间的x去除之后,能正常替换,输出“http://img2.com.cn/images/2014/038/422/14058002224830.9000001763_200x200x100.jpg”;

真是太奇怪了,这个“x”到底招谁惹谁了?
那说明你的正则是有问题的

那为何直接赋值,如:
$thumb='http://img2.com.cn/images/2014/038/422/14058002224830.9000001763_100x100.jpg';

就没有问题。

从你给的东西来看看不出什么错误来 你在仔细调试下


var_dump($r['thumb']);
贴出结果


string(85) "http://img2.com.cn/images/2014/038/422/14058002224830.9000001763_100x100.jpg"
你这个字串只有76个字符,为何是string(85) ?

正则这种东西 搞不定的话 只能从源头开始了
$str = '_100x100.jpg';
echo preg_replace('/_/', '', $str);
echo preg_replace('/_\d+/', '', $str);
echo preg_replace('/_\d+x/', '', $str);
echo preg_replace('/_\d+x\d+/', '', $str);
看看哪个有问题 看懂的话就去试试吧...



var_dump($r['thumb']);
贴出结果


string(85) "http://img2.com.cn/images/2014/038/422/14058002224830.9000001763_100x100.jpg"
你这个字串只有76个字符,为何是string(85) ?

这个真的很奇怪,最后用正则“/_\d+.{6}\d+/” 解决了。可能在php的函数中,“x”被生成的6个,不知名的东西。85-76=9,应该是9个吧,最后三个可能是数字。

已确定“x”被转换成其他的9个字符,可能是编码不同引起的

已确定“x”被转换成其他的9个字符,可能是编码不同引起的

更正一下,“x”被生成的6个是正确的,

string(85) "http://img2.com.cn/images/2014/038/422/14058002224830.9000001763_100x100.jpg",对于后面的字符人为的删除了3个