在原文件名前加上前缀并实现文件的批量重命名

要在原文件名前加上前缀并实现文件的批量重命名,你可以根据你所使用的操作系统选择合适的脚本语言来编写脚本。以下是在不同操作系统上实现这一功能的示例:

在 Windows 上使用 PowerShell

# 设置文件夹路径
$folderPath = "C:\path\to\your\folder"

# 设置前缀
$prefix = "prefix_"

# 获取文件夹中的所有文件
$files = Get-ChildItem -Path $folderPath

# 遍历并重命名每个文件
foreach ($file in $files) {
    # 构造新的文件名
    $newName = $prefix + $file.Name
    # 重命名文件
    Rename-Item -Path $file.FullName -NewName (Join-Path $folderPath $newName)
}

在 macOS/Linux 上使用 Shell 脚本

#!/bin/bash

# 设置文件夹路径
folder_path="/path/to/your/folder"

# 设置前缀
prefix="prefix_"

# 进入文件夹
cd "$folder_path"

# 遍历并重命名每个文件
for file in *; do
  if [ -f "$file" ]; then
    new_name="${prefix}${file}"
    mv "$file" "$new_name"
  fi
done

在 Python 中使用 os 模块

import os

# 设置文件夹路径
folder_path = '/path/to/your/folder'

# 设置前缀
prefix = 'prefix_'

# 获取文件夹中的所有文件
files = os.listdir(folder_path)

# 遍历并重命名每个文件
for file_name in files:
    if os.path.isfile(os.path.join(folder_path, file_name)):
        new_name = prefix + file_name
        os.rename(os.path.join(folder_path, file_name), os.path.join(folder_path, new_name))

注意事项

  1. 确保你有权限:在重命名文件之前,确保你有足够的权限来修改文件名。
  2. 避免命名冲突:如果添加前缀后可能导致文件名冲突(例如,原文件中已经存在以该前缀开头的文件),你需要考虑如何处理这种情况,比如检查新文件名是否已存在,或者添加额外的序号来避免冲突。
  3. 测试脚本:在正式运行脚本之前,最好在一个包含少量测试文件的文件夹中测试脚本,以确保它按预期工作。

将上述脚本中的 folder_path 或 $folderPath 替换为你的文件夹路径,将 prefix 替换为你想要添加的前缀,然后运行脚本即可。

yii2 checkboxlist使用及数据入库

视图表单部分

<?php $form = \yii\widgets\ActiveForm::begin() ?>
 
<?=$form->field($model,'username')->textInput() ?>
 
<?=$form->field($model,'hobby')->checkboxList(['1'=>'篮球','2'=>'足球','3'=>'游戏','4'=>'读书'])?>
 
 
<?=\yii\helpers\Html::submitButton('保存',['class'=>'btn btn-primary'])?>
 
<?php \yii\widgets\ActiveForm::end()?>

模型部分

public function beforeSave($insert) {
    if($this->hobby) {
        $this->hobby = implode(',',$this->hobby);
 
    }
    return parent::beforeSave($insert); // TODO: Change the autogenerated stub
}
 
public function afterFind() {
    $this->hobby = explode(',',$this->hobby);
    parent::afterFind();
}
yii2.0 的 多选框实现方法

第一种:
ActiveForm::checkboxList();
 优点:可以将全部数据生成多选框,自带验证

$form->field($model, 'username')->checkboxList(ArrayHelper::map($data,'id', 'customer_name'));
第二种:
ActiveForm::checkbox();
 优点:只生成一个多选框,自带验证

$form->field($model, 'username')->checkbox(ArrayHelper::map($data,'id', 'customer_name'));
第三种:
Html::activeCheckbox();

Html::activeCheckbox($model, 'username', ArrayHelper::map($data,'id', 'customer_name'));
第四种:
Html::activeCheckboxList();

Html::activeCheckboxList($model, 'username', ArrayHelper::map($data,'id', 'customer_name'));

实现多选题评分

多选题的给分原则是多选错选不得分,部分选对得部分分

$q_answer = 'A,B,C'; //正确答案

$s_answer = 'A,D';  //学生答案
$q_answer = explode(',',$q_answer);
$s_answer = explode(',',$s_answer);

$count = count($q_answer);

$score = 6;

if(count(array_diff($s_answer,$q_answer)) > 0)
{
      $real_score = 0;
}
else
{
      $real_score = $score * count(array_intersect($q_answer,$s_answer)) / $count;
}
echo $real_score;

运行结果为:0

Yii2.0中的COOKIE和SESSION用法

Yii2的Cookie主要是通过yii/web/Request和yii/web/Response进行操作的,Yii2的Session比较简单 ,直接通过/Yii::$app->session进行操作就好了。本文给大家介绍COOKIE和SESSION用法,需要的朋友参考下

1、Cookie

Yii2的Cookie主要是通过yii/web/Request和yii/web/Response进行操作的 ,通过/Yii::$app->response->getCookies()->add()添加Cookie,通过/Yii::$app->request->cookies读取Cookie.

1)添加一个Cookie

<?php
//第一种方法
$cookie= new/yii/web/Cookie();
$cookie-> name = 'smister';//cookie的名称
$cookie-> expire = time() + 3600; //存活的时间
$cookie-> httpOnly = true; //无法通过js读取cookie
$cookie-> value = 'cookieValue'; //cookie的值
Yii::$app->response->getCookies()->add($cookie);
//第二种方法
$cookie= new/yii/web/Cookie([‘name' => ‘smister',‘expire' => time() + 3600,‘httpOnly ' => true,‘value' => ‘cookieValue']);
Yii::$app->response->getCookies()->add($cookie);
?>

2) 读取一个Cookie

<?php
$cookie= Yii::$app->request->cookies;//返回一个/yii/web/Cookie对象
$cookie->get(‘smister');//直接返回Cookie的值
$cookie->getValue(‘smister'); //$cookie[‘smister'] 其实这样也是可以读取的
//判断一个Cookie是否存在
$cookie->has(‘smister');//读取Cookie的总数
$cookie->count();//$cookie->getCount();跟count一样
?>

3) 删除Cookie

<?php
$cookie= Yii::$app->request->cookies->get(‘smister');
//移除一个Cookie对象
Yii::$app->response->getCookies()->remove($cookie);
//移除所有Cookie,目前好像不太好使
Yii::$app->response->getCookies()->removeAll();
?>

4) 注意

对Cookie进行增删改时调用的response , 对Cookie读取时使用的是Request

2、Session

Yii2的Session比较简单 ,直接通过/Yii::$app->session进行操作就好了

1) 添加一个session

<?php
$session= Yii::$app->session;
$session->set('smister_name', 'myname');
$session->set('smister_array',[1,2,3]);
?>

2) 读取一个session

<?php
$session= Yii::$app->session;
//读取一个Session
$session->get('smister_name);
?>

3) 删除Session

<?php
$session= /Yii::$app->session;
//删除一个session
$session->remove(‘smister_name');
//删除所有session
$session->removeAll();
?>

解决cURL error 60: SSL certificate problem

今天在做本地环境开发阿里云短信验证时报错:cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)

解决办法

进入:https://curl.se/docs/caextract.html

下载最新版Cacert.pem
复制这个文件到php的安装目录下,如下图所示

打开php.ini文件,搜索curl.cainfo 去掉前面的#注释 填上该文件的绝对路径,如下图所示: 

*注意:如果按照上面这个方式还报错的可能就是openssl没有开启,php的openssl扩展需要开启 

调用Yii::getAlias与Yii::setAlias的用法

别名用来表示文件路径和URL,简化引用,避免在代码中编码一些绝对路径和URL。一个别名必须以‘@’字符开头,以区别于传统的文件路径和URL。
定义别名:调用Yii::setAlias()给文件路径或URL定义别名:
// 文件路径的别名
Yii::setAlias(‘@foo’, ‘/path/to/foo’);
// URL 的别名
Yii::setAlias(‘@bar’, ‘http://www.example.com’);
注意:别名所指向的文件路径或 URL 不一定是真实存在的文件或资源。
可以通过在一个别名后面加斜杠 / 和一至多个路径分段生成新别名(无需调用 Yii::setAlias())。我们把通过 Yii::setAlias() 定义的别名称为根别名,而用他们衍生出去的别名成为衍生别名。例如,@foo 就是根别名,而 @foo/bar/file.php 是一个衍生别名。
你还可以用别名去定义新别名(根别名与衍生别名均可):
Yii::setAlias(‘@foobar’, ‘@foo/bar’);
解析别名:调用Yii::getAlias解析别名到对应的文件路径或URL:如
// echo Yii::getAlias(‘@webroot’); // D:/path/yiibasic/web
// echo Yii::getAlias(‘@app’); // D:\path\yiibasic
// echo Yii::getAlias(‘@web’); // /yiibasic/web
注意:Yii::getAlias() 并不检查结果路径/URL 所指向的资源是否真实存在。
系统定义的路径别名:
@yii – BaseYii.php 文件所在的目录(也被称为框架安装目录)
@app – 当前运行的应用程序的基本路径 yii\base\Application::basePath
@common – 公共文件目录
@frontend – 前端web应用程序目录
@backend – 后端web应用程序目录
@console – 控制台目录
@runtime – 当前运行的应用的 yii\base\Application::runtimePath
@vendor – yii\base\Application::vendorPath
@webroot – 当前运行应用的 Web 入口目录
@web – 当前运行应用的根 URL

传递access_token参数的正确方式

在OAuth中, access_token参数的传递如何才能更安全呢? 不知你有没有具体去研究过, 在此总结传递access_token的正确方式,

(所谓正确方式是指传递方式更安全, 更隐匿, 更不容易被网络拦截,网络攻击的方式)

在 spring-oauth-server 与 oauth2-shiro 中均支持以下提到的传递access_token的方式.

1. 通过Header传递 access_token; [推荐]

在请求URL的Header中, 添加header -> Authorization: bearer access_token,  示例代码(Java):postHandler.addHeader(“Authorization”, “bearer 0fe12a74-e613-4d1b-9785-f96847bad346”);

一般在代码中使用httpclient或URLConnection来实现,如Android, IOS客户端, 不适用于浏览器传递access_token

2.若请求URL使用POST方式提交, 将access_token放在请求body中而不是拼接在URL上, 示例代码(HTML):<form action=”db_table_description” method=”post”> <input type=”hidden” name=”access_token” value=”0fe12a74-e613-4d1b-9785-f96847bad346″/> <input type=”text” name=”username”/> <button type=”submit”>Submit</button> </form>

3.最后的选择, 通过URL拼接参数access_token, 示例代码:http://monkeyk.com/oauth_test?access_token=0fe12a74-e613-4d1b-9785-f96847bad346

一般使用在GET请求, POST等其他请求方式也支持

以上三种方式, 优先选择第一,第二种, 少用第三种方式.这些方式都是基于HTTP请求下所采用的.
更安全的传递access_token的方式是启用HTTPS连接,保证网络传输安全.

提取试卷题目及题号和选项

以下代码的功能是为了实现提取题目中的题号,题目,如是选择题则提取选项,具体代码如下:

// 提取试卷题目及题号
$text = "11. 已知椭圆 $C: \frac{x^{2}}{a^{2}}+\frac{y^{2}}{b^{2}}=1(a>b>0)$ 的左、右焦点分别为 $F_{1}, F_{2}$, 点 $M$ 是椭圆 $C$ 上任意一点, 且 $\overrightarrow{M F_{1}} \cdot \overrightarrow{M F_{2}}$ 的取值范围为 $[2,3]$. 当点 $M$ 不在 $x$ 轴上时, 设 $\triangle M F_{1} F_{2}$ 的内切圆半径为 $m$, 外接圆 半径为 $n$, 则 $m n$ 的最大值为 ( ) A. $\frac{1}{3}$ B. $\frac{1}{2}$ C. $\frac{2}{3}$ D. 1
12. 设函数 $f(x)=\mathrm{e}^{3 \ln -x}-x^{2}-(a-4) x-4$, 若 $f(x) \leqslant 0$, 则 $a$ 的最小值为 $(\quad)$ A. e B. $\frac{1}{\mathrm{e}}$ C. $\frac{1}{\mathrm{e}^{2}}$ D. $\frac{4}{\mathrm{e}^{2}}$
13. $\left(x^{2}-\frac{2}{x}\right)^{6}$ 的展开式中常数项是___.
14. 数列 $\left\{a_{n}\right\}$ 的前 $n$ 项和为 $S_{n}$, 若 $a_{1}=1, a_{n+1}=S_{n}$, 则 $a_{n}=$
15. 在棱长为 2 的正方体 $A B C D-A_{1} B_{1} C_{1} D_{1}$ 中, 若 $E$ 为棱 $B B_{1}$ 的中点, 则平面 $A E C_{1}$ 截正方体 $A B C D-A_{1} B_{1} C_{1} D_{1}$ 的截面面积为___
16. 若函数 $f(x)=\left|x-\sqrt{4-4 x^{2}}-2\right|-2 a-1$ 有两个零点, 则实数 $a$ 的取值范围为___";


$pattern = "/(\d+)\.\s(.*?)(?=\d+\.|\Z)/ms";
preg_match_all($pattern, $text, $matches, PREG_SET_ORDER);


// print_r($matches);

foreach ($matches as $match) {

	$item['number'] = $match[1];
	$item['content'] = $match[2];
    // $number = $match[1];
    // $title = $match[2];


    // echo "题号:$number;题目:$title\n";

    $regex = '/[A-D]\.(.*?)(?=[A-D]\.|\Z)/ms';

    # $regex = '/^[A-D]\.\s(.+)(?=[A-D]+\.|\Z)$/ms';
	if(preg_match_all($regex, $item['content'], $matches2))
	{
		// print_r($matches2);
		$item['options'] = $matches2[1];

		$item['content'] = str_replace($matches2[0],'',$item['content']);
	}


	print_r($item);	

}

运行效果如下:

不合规范的html段落php处理细则

最近业余时间在维护一个rss聚合应用,就发现很多网站feed的条目摘要存在各种问题,用strip_tags一刀切吧,对摘要的段落和样式扭曲了

例如:有一些网站的摘要是截断输出,例如指定的摘要长度截断,这样会导致摘要中出现非闭合的html标签,下面的摘要是一个例子:

$str=<<<EOF
<P>  【手机中国 导购】时间过得真快,转眼就我们就已经度过了2013年的上半年,而我们也悄无声息地老了半岁。不过随着时间的流逝,手机行业也在快速的进步着,其发展速度之快可以用日新月异来形容了。</P>
 <P align=center><IMG style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="2.2GHz骁龙800四核 上半年热门机N宗最 " align=1 src="http://imgm.cnmo.com/cnmo_product/18_500x375/698/ceFYnyzZgUijQ.jpg"><BR>2012年的旗舰机型HTC Butterfly</P>
 <P>  回首2012年,手机市场还处于一个相对比较矛盾的时期,国产手机的初露锋芒以及国际大牌的推陈出新,让消费者有些摸不清头脑。到了2013年之后,虽然这个现象还存在着,唯一不同的就是消费者已经逐渐习惯了这个现状,整个手机行业也是在不断的向前进。</P>
 <P>  毫不夸张的说,今天刚刚上市了一款各个方面都表现突出的机皇级旗舰机,也许明天就被其他品牌旗舰所取代,这是一个不争的事实。但相比来说,每个品牌每款旗舰也都有自己的特长,比如处理器主频高或是屏幕尺寸大等等。</P>
 <P align=center><IMG style="BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid" alt="6.44英寸屏骁龙800 上半年热门机N宗最 " src="http://img.cnmo-img.com.cn/905/904155.jpg"></P>
 <P>  俗话说风水轮流转,曾经榜上有名的强机也许今天就名落孙山,物竞天择,适者生存这句话说的不无道理。今天笔者也给大家统计了2013上半年最新智能手机N宗最,下面就让我们一起看一下吧。<STRONG>
EOF;


上面的摘要有几点不合法:
1.html标签大写
2.最后一个strong由于截断没有正常闭合,strong的父标签p丢失
3.标签的属性中出现了一些样式属性和定义,像:align,style

下面说一说它们的影响
2:如果不加处理的输出会造成页面样式混乱,像非正常闭合的strong浏览器会自动把它后面的输出算成它的子元素.
3:样式定义可能影响你的页面样式,图片溢出你的摘要容器
1:不会造成视觉上的错误,但它会影响你的html合法性

下面来说说处理方法
3:可以用正则把属性给替换掉,像

preg_replace("/<([a-z][a-z0-9]*)(?:[^>]*(\ssrc=['\"][^'\"]*['\"]))?[^>]*?(\/?)>/i",'<$1$2$3>',$str);


2:可以用DOMNode::C14N方法来规范,它可以把丢失的标签给补上,只不过<img />会变成<img></img>

等等:
1.为什么不用strip_tags来处理呢?
是可以,虽然它也可以保留指定的标签,但我会把哪些不安全的标签交给htmlentities

2.好像dom可以删除属性吧!
对,这是下面要讲的,综合处理1,2,3的代码如下

$doc = new DOMDocument();
$doc->formatOutput=false;

$doc->loadHTML(mb_convert_encoding($str, 'HTML-ENTITIES', 'UTF-8'));
$nodes = $doc->getElementsByTagName('*');
foreach ( $nodes as $node ) {
	$delAtts=array();
	//找到节点的所有属性
	$nodeN=$node->tagName;
	$nodeAtts=$node->attributes;
	foreach($nodeAtts as $attN=>$att){
		//是img保留src属性
		if(strtolower($attN)=='src' && strtolower($nodeN)=='img') continue;
		//不是直接删除所有属性
		array_push($delAtts,$attN);
	}
	foreach($delAtts as $A){
		$node->removeAttribute($A);
	}
}
$doc->saveHTML();
$pstr=$doc->GetElementsByTagName('body')->item(0)->C14N();
//clear empty tag
$pstr=preg_replace('/<(\w+)>(\s| )*<\/\1>/i',"",$pstr);


大体上已经OK了,$pstr的内容是body包裹的$str,最后只需要把body解决掉就可以.
最后要说的有几点:
1.一定不要在遍历属性时把它删除,例如:img有三个属性style,src,alt,它只会删除掉style,style后面的并不会删除
2.一定不要用saveHTML()的返回值作为后续处理的内容,后果是汉字变成如下的东东:

&#12288;&#12288;&#22238;&#39318;2012&#24180;&#65292;&#25163;&#26426;&#24066;&#22330;&#36824

也不要怕,只需要再调一次

mb_convert_encoding($str, 'UTF-8','HTML-ENTITIES')


就ok了,为了偷懒,所以它的返回值不要用

3.$doc->GetElementsByTagName('body')->item(0)->C14N();


也可以换成:

$doc->documentElement->C14N();


只不过返回值不光有body还有html标签,不在乎的话也可以用它,毕竟比GetElementsByTagName更省事