要匹配 <tr...> 标签但缺少闭合标签 </tr> 的情况,有几种解决方案:
方法1:使用正则表达式容忍不完整标签
$pattern = '/<trb[^>]*>(?:(?!</tr>).)*$/is';
preg_match_all($pattern, $html, $matches);
这个正则表达式的含义:
<trb[^>]*> 匹配开始 tr 标签
(?:(?!</tr>).)* 匹配任何不包含 </tr> 的字符
$ 确保匹配到字符串末尾(即没有闭合标签)
方法2:使用 DOM 解析器更可靠地处理
正则表达式不是处理 HTML 的最佳工具,特别是对于不完整的标记。更好的方法是使用 PHP 的 DOM...
htmlspecialchars函数多常用于防止xss攻击,htmlspecialchars函数要转义单引号需要设置第二个参数为ENT_QUOTES,转义双引号需要设置第二个参数为ENT_NOQUOTES
一、定义和用法
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
预定义的字符是:
& (& 符号) =============== &
" (双引号) =============== "
' (单引号) =============== '
< (小于号) =============== <
> (大于号) =============== >
<?php
$str = "This is some <b...
$arr = [
[3,'c'],
[3,'f'],
[3,'d'],
[3,'k'],
[3,'a'],
[7,'b'],
[7,'k'],
[1,'v'],
[4,'a'],
[2,'e'],
[2,'a'],
];
foreach ($arr as $key => $r ) {
$a[$key] = $r[0];
$b[$key] = $r[1];
}
array_multisort($a, SORT_ASC, $b, SORT_DESC, $arr);
echo '<pre>';
print_r($arr);
结果如下:
Array
(
[0] => Array
(
[0] => 1
[1] => v
)
[1] => Array
(
[0] => 2
[1] => e
)
[2] => Array
(
[0] =>...
XML文件内容:
<?xml version="1.0" encoding="utf-8"?>
<list>
<match id="2650860" matchTime="2024-08-22 19:35" matchLeague="中协杯" matchRound="1/4决赛" hometeam="上海申花" guestteam="北京国安" matchHot="0" queryTime="2024-08-21 15:39:30"></match>
<match id="2650861" matchTime="2024-08-22 19:35" matchLeague="中协杯" matchRound="1/4决赛" hometeam="上海海港" guestteam="天津津门虎" matchHot="0" queryTime="2024-08-21 15:39:41"></match>
<match id="2653813" matchTime="2024-08-22 20:00" matchLeague="东盟锦标" matchRound="小组赛" hometea...
$xml = simplexml_load_file($xmlfile);
$k = 0;
foreach ($xml->match as $item){
$matchTime = $item->attributes()['matchTime'];//<match matchTime="" ...></match>节点属性
if(DateDiff('h',$matchTime,$curTime) >= 3) {//数据筛选条件
$delArr[] = $k;
}
$k++;
}
if(!empty($delArr)){//循环删除 因删除后match主键的变动 依次删除
foreach ($delArr as $d=>$v) {
unset($xml->match[$v-$d]);
}
}
$xml->asXML($xmlfile);
...
使用curl_multi_exec并发请求外部接口
有时候在一个PHP方法中要多次调用外部的接口,为了优化代码,提高效率,我们不妨使用curl_multi_exec并发处理多个请求,这样可以明显地提高获取响应数据的速度,减少程序执行的时间,下面是一个实际运行的例子。
<?php
/**
* 使用curl并行发送多个请求获取数据
* @param array $urls 多个请求数组
* @return array
*/
function sendMultiRequest(array $urls)
{
$conn = [];
$res = [];
//创建批处理curl句柄
$mh = curl_multi_init();
foreach ($urls as $k => $item) {
$conn[$k] = curl_init(); //初始化各个子连接
//...
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://xxxxx.xxx');//使用一个不存在的地址
curl_exec($ch);
此时会返回一个错误码:curl_errno($ch)
对应的使用$errlist[curl_errno($ch)]就能返回中文的错误说明
$errlist = array(
'1'=>'CURLE_UNSUPPORTED_PROTOCOL (1) – 您传送给 libcurl 的网址使用了此 libcurl 不支持的协议。 可能是您没有使用的编译时选项造成了这种情况(可能是协议字符串拼写有误,或没有指定协议 libcurl 代码)。',
'2'=>'CURLE_FAILED_INIT (2) – 非常早期的初始化代码失败。 可能是内部错误或问题。',
'3'=>'CURLE...
构思
由于互联网的机制,在不使用 Websocket 的情况下,是不能够长时间与用户持续保持连接的。所以我这里打算使用 COOKIE 与数据库信息进行校验。 其中用户端储存的 Token 是经过 hash 加密过的数据,数据库存储的数据是不经过 hash 加密的原始数据。最终通过一系列计算后使用 PHP 自带的 hash 校验函数进行 Token 验证。
为什么我前面说实现一端登录,另一端自动注销呢? Token 在执行登陆之前,会生成初始 Token 数据,这部分数据是没有经过加密而且没有进行组合的,存储在 SESSION 中。在用户执行登陆时候,自行生成4位随机数做基础计算数据,随后检查目前服务器时间戳与用户端生成的 Token 数据进行比对,以及获...
一、用户认证问题
最初互联网用户认证一般流程如下:
1、用户登录,向服务器发送用户名和密码。
2、服务器验证用户信息通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。
3、服务器向用户返回一个 session_id,客户端获取后将这个session_id写入 Cookie。
4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。
5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。
这种模式的问题在于:
1.扩展性不好。单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求 session 数据共享,每台服务器都能够读取 session
2.服务端为了存贮...
随着互联网和移动互联网的快速发展,网站和应用的用户量不断增加,用户数据的安全性和权限控制变得尤为重要。而传统的基于用户名和密码的鉴权方式在一定程度上存在安全风险和复杂性。而基于Token的鉴权机制,既安全又简单。
什么是Token鉴权机制?
Token鉴权机制是一种无状态的鉴权方式,用户登录认证成功后,后端服务器生成一个Token并返回给客户端。客户端每次请求都在请求头中携带Token,后端通过校验Token的合法性来鉴权,从而保证了用户的权限和安全性。
下面我们来手把手教你使用PHP实现基于Token的鉴权。
步骤一:生成Token
要实现Token鉴权,首先我们需要生成Token。
在PHP中,我们可以使用JWT(JSO...
$a = 'aaaaaaaaaaa';
正常情况下,如果出现php和html混合输出的时候,我们一般这样写:
echo '<pre>输出变量a的值'.$a.'</pre>';
我们也可以这样写,就不用连字符了
echo "<pre>{$a}</pre>";
这里要注意,一定要使用双引号,如果使用单引号,则不会输出变量值
/**
* 纯真 IP 数据库查询
*
* 参考资料:
* - 纯真 IP 数据库 http://www.cz88.net/ip/
* - IpLocation https://github.com/nauxliu/IpLocation/
* - 基于本地数据库的 IP 地址查询
*
* 使用示例:
* $ip = new IPQuery();
* $addr = $ip->query('IP地址');
* print_r($addr);
*/
class IPQuery {
private $fh; // IP数据库文件句柄
private $first; // 第一条索引
private $last; // 最后一条索引
private $total; // 索引总数
private $dbFile = __DIR__ . DIRECTORY_SEPARATOR . 'qqwry.dat'; // 纯真...
function sort_query($arr1,$arr2) { //这是排序用的,按修改时间
if ($arr1['updatetime'] == $arr2['updatetime']) return 0;
return ($arr1['updatetime'] > $arr2['updatetime'] ) ? -1 : 1;
}
$rootFolder = 'upload';
$directory = !empty($_GET['path'])?$_GET['path']:$rootFolder;
$mydir = dir($directory);
$arrImageType = array('jpg','jpeg','gif','bmp','png','tif');
while ($file = $mydir->read()) {
if ((is_dir($directory.'/'.$file))) {
$nodess[] = array('text'=>$file, 'path'=>$directory.'/'.$file, 'updatetime'=>filemtime($directory.'/'.$file), '...
功能需求:通过设置一个websocket服务端与客户端连接,增加一个后端接口,当接口触发时,推送消息到客户端
客户端JS通过new WebSocket时,会在服务端完成握手。而php接口通过socket_create、socket_connect连接,不会完成握手,也不需要。所以通过传递参数 from 来判断是从客户端还是从接口传来的消息
PHP服务端代码:server.php
<?php
class socketServer
{
const LISTEN_SOCKET_NUM = 9;
const LOG_PATH = "./log/"; //日志
private $_ip = "127.0.0.1"; //ip
private $_port = 8080; //端口 要和前端创建WebSocket连接时的端口号一致
private $_socketPool =...
(一)WebSocket数据的收发协议 首先,对于客户端向服务器发送数据,都是以数据帧形式传输,下面给出数据帧格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| &nbs...
(一)什么是WebSocket?
WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
(二)WebSocket的作用?
WebSock其实在平常使用,我们是时常见到的,用于实时通讯,例如我们常用的实时聊天、服务端向客户端消息推送、也可以实现踢用户下线功能。实时弹幕功能等等。
(三)...