截取字符串并保留完整xml标签的php代码,有需要的朋友可以参考下。
/**
* author: goosman
* blog: http://blog.csdn.net/lgg201
* mail: lgg860911@yahoo.com.cn
*/
$str = '0123456789<a>012</a>0123456789';
function substr_remain_tag($s, $o, $l) {
$is_match = preg_match_all(<<<heredoc
;
#该正则表达式解析xml标签, 标签属性内部支持转义符"\", 支持对"\"自身和对应引号的转义
<(\w+) #标签开始
(?: #属性列表
\s+ #前置空格
\w+ #属性名
\s* #属性名后的空白(为了兼容)
= #属性名值之间的等号
\s* #属性值前的空白(为了兼容)
(?: #属性值(引号处理)
" #双引号的情况
(?:
\\\\\\\\ #吃掉连续两个转义符(表示转义符自身)
|
\\\\" #吃掉转义符接着一个引号(表示转义的引号)
|
[^"\\\\]* #其他字符
)*
"
|
' #单引号情况
(?:
\\\\\\\\ #吃掉连续两个转义符(表示转义符自身)
|
\\\\' #吃掉转义符接着一个引号(表示转义的引号)
|
[^'\\\\]* #其他字符
)*
'
)
)*
>
.*? #标签内容
</(?1)> #结束标签
;x
heredoc
, $s, $matches, PREG_OFFSET_CAPTURE, $o);
if ( $is_match ) {
foreach ( $matches[0] as $match ) {
$o0 = $match[1];
#标签左边界越过截取目标右边界, 退出
if ( $o0 >= $o + $l ) break;
$l0 = strlen($match[0]);
#标签右边界在截取目标右边界内, 继续
if ( $o0 + $l0 < $o + $l ) continue;
#以下为标签跨边界处理
$l = $o0 + $l0 - $o;
break;
}
}
return substr($s, $o, $l);
}
echo $str . chr(10);
echo substr_remain_tag($str, 0, 20) . chr(10);
对用户身份验证,最常用的方法就是将用户id与密码保存进数据库中了,然后再写一些登录检测代码,就可以使用了。
创建用户信息表:
CREATE TABLE tbl_auth_user (
user_id VARCHAR(10) NOT NULL,
user_password CHAR(32) NOT NULL,
PRIMARY KEY (user_id)
);
INSERT INTO tbl_auth_user (user_id, user_password) VALUES ('theadmin', PASSWORD('chumbawamba'));
INSERT INTO tbl_auth_user (user_id, user_password) VALUES ('webmaster', PASSWORD('webmistress'));
我们将使用相同的html代码来创建登录表单在上述示例中创建的。我们只需要修改登录过程有点。
登录脚本:
<?php
// 我们必须永远不会忘记启动会话
session_start();
$errorMessage = '';
if (isset()($_POST['txtUserId']) && isset($_POST['txtPassword'])) {
include 'library/config.php';
include 'library/opendb.php';
$userId = $_POST['txtUserId'];
$password = $_POST['txtPassword'];
// 检查用户id和密码组合存在于数据库
$sql = "SELECT user_id
FROM tbl_auth_user
WHERE user_id = '$userId'
AND user_password = PASSWORD('$password')";
$result = mysql_query()($sql)
or die('Query failed. ' . mysql_error());
if (mysql_num_rows($result) == 1) {
// sessionthe设置用户id和密码匹配,
// 设置会话
$_SESSION['db_is_logged_in'] = true;
// 在登录后我们转到主页
header('Location: main.php');
exit;
} else {
$errorMessage = 'Sorry, wrong user id / password';
}
include 'library/closedb.php';
}
?>
/ /…相同的html登录表单前一个示例一样
而不是检查用户id和密码对硬编码的信息我们查询数据库,如果这两个存在于数据库使用SELECT查询。如果我们发现一个匹配我们设置会话变量和移动到主页。注意,会话的名字是前缀 “db”使它不同于先前的示例。
在接下来的两个脚本(主要。php和注销。php)代码类似于前一个。唯一的区别是会话名称。这是为这两个的代码
<?php
session_start();
//是一个访问这个页面登录呢?
if (!isset($_SESSION['db_is_logged_in'])
|| $_SESSION['db_is_logged_in'] !== true) {
// 没有登录,返回到登录页面
header('Location: login.php');
exit;
}
?>
/ /…这里的一些html代码
<?php
session_start();
// 如果用户已登录,设置会话
if (isset($_SESSION['db_is_logged_in'])) {
unset($_SESSION['db_is_logged_in']);
}
// 现在,用户登录,
// 去登录页面
header('Location: login.php');
?>
当PHP引擎遇到未实例化的类时就会触发这个方法,当然你的php代码中要用到__autoload()才可以哦。
下面是一段使用__autoload()的代码,供大家学习参考:
/**
* 自动加载相关类库文件
*/
function __autoload($classname){
if(substr($classname,-6)=="Action"){
include APP_PATH.'controllers/'.$classname.'.class.php';
}elseif(substr($classname, -5)=="Model"){
include APP_PATH.'models/'.$classname.'.class.php';
}elseif($classname=="Smarty"){
include SYSTEM_PATH.'smarty/Smarty.class.php';
}else{
include APP_PATH.'common/'.$classname.'.class.php';
}
}
?>
另一种包含路径的方法:
function __autoload($class_name) {
$path = str_replace()('_', DIRECTORY_SEPARATOR, $class_name);
require_once $path.'.php';
}
?>
说明:将下划线转换为目录分隔符(DIRECTORY_SEPARATOR),这样做即可以有效管理库文件,又解决了跨平台的问题。