最近取消了SSL协议,如您访问的是https的页面,请跳转到http的页面访问。在此给您带来不便之处敬请谅解。
古之成大事者,不惟有超世之才,亦有坚韧不拔之志。
分页: 1/18 第一页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]

PHP中正则表达式使用详解(转) 不指定

admin , 2010/08/01 11:03 , PHP , 评论(0) , 阅读(9) , Via 宝华的博客 原创
本文永久地址: http://agileblog.cn/PHP-Regular-Expressions/
如果我们问那些UNIX系统的爱好者他们最喜欢什么,答案除了稳定的系统和可以远程启动之外,十有八九的人会提到正则表达式;如果我们再问他们最头痛的是什么,可能除了复杂的进程控制和安装过程之外,还会是正则表达式。那么正则表达式到底是什么?如何才能真正的掌握正则表达式并正确的加以灵活运用?本文将就此展开介绍,希望能够对那些渴望了解和掌握正则表达式的读者有所助益。

入门简介
  简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。我们可以在几乎所有的基于UNIX系统的工具中找到正则表达式的身影,例如,vi编辑器,Perl或PHP脚本语言,以及awk或sed shell程序等。此外,象JavaScript这种客户端的脚本语言也提供了对正则表达式的支持。由此可见,正则表达式已经超出了某种语言或某个系统的局限,成为人们广为接受的概念和功能。
  正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。
  举例来说,正则表达式的一个最为普遍的应用就是用于验证用户在线输入的邮件地址的格式是否正确。如果通过正则表达式验证用户邮件地址的格式正确,用户所填写的表单信息将会被正常处理;反之,如果用户输入的邮件地址与正则表达的模式不匹配,将会弹出提示信息,要求用户重新输入正确的邮件地址。由此可见正则表达式在WEB应用的逻辑判断中具有举足轻重的作用。

基本语法
  在对正则表达式的功能和作用有了初步的了解之后,我们就来具体看一下正则表达式的语法格式。
  正则表达式的形式一般如下:
  /love/
  其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
  较为常用的元字符包括: “+”, “*”,以及 “?”。其中,“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次,“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次,而“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。
  下面,就让我们来看一下正则表达式元字符的具体应用。
  /fo+/
  因为上述正则表达式中包含“+”元字符,表示可以与目标对象中的 “fool”, “fo”, 或者 “football”等在字母f后面连续出现一个或多个字母o的字符串相匹配。
  /eg*/
  因为上述正则表达式中包含“*”元字符,表示可以与目标对象中的 “easy”, “ego”, 或者 “egg”等在字母e后面连续出现零个或多个字母g的字符串相匹配。
  /Wil?/
  因为上述正则表达式中包含“?”元字符,表示可以与目标对象中的 “Win”, 或者 “Wilson”,等在字母i后面连续出现零个或一个字母l的字符串相匹配。
  除了元字符之外,用户还可以精确指定模式在匹配对象中出现的频率。例如,
  /jim{2,6}/
  上述正则表达式规定字符m可以在匹配对象中连续出现2-6次,因此,上述正则表达式可以同jimmy或jimmmmmy等字符串相匹配。
  在对如何使用正则表达式有了初步了解之后,我们来看一下其它几个重要的元字符的使用方式。
  \s:用于匹配单个空格符,包括tab键和换行符;
  \S:用于匹配除单个空格符之外的所有字符;
  \d:用于匹配从0到9的数字;
  \w:用于匹配字母,数字或下划线字符;
  \W:用于匹配所有与\w不匹配的字符;
  . :用于匹配除换行符之外的所有字符。
  (说明:我们可以把\s和\S以及\w和\W看作互为逆运算)
  下面,我们就通过实例看一下如何在正则表达式中使用上述元字符。
  /\s+/
  上述正则表达式可以用于匹配目标对象中的一个或多个空格字符。
  /\d000/
  如果我们手中有一份复杂的财务报表,那么我们可以通过上述正则表达式轻而易举的查找到所有总额达千元的款项。
  除了我们以上所介绍的元字符之外,正则表达式中还具有另外一种较为独特的专用字符,即定位符。定位符用于规定匹配模式在目标对象中的出现位置。
  较为常用的定位符包括: “^”, “$”, “\b” 以及 “\B”。其中,“^”定位符规定匹配模式必须出现在目标字符串的开头,“$”定位符规定匹配模式必须出现在目标对象的结尾,\b定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一,而“\B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。同样,我们也可以把“^”和“$”以及“\b”和“\B”看作是互为逆运算的两组定位符。举例来说:
  /^hell/
  因为上述正则表达式中包含“^”定位符,所以可以与目标对象中以 “hell”, “hello”或 “hellhound”开头的字符串相匹配。
  /ar$/
  因为上述正则表达式中包含“$”定位符,所以可以与目标对象中以 “car”, “bar”或 “ar” 结尾的字符串相匹配。
  /\bbom/
  因为上述正则表达式模式以“\b”定位符开头,所以可以与目标对象中以 “bomb”, 或 “bom”开头的字符串相匹配。
  /man\b/
  因为上述正则表达式模式以“\b”定位符结尾,所以可以与目标对象中以 “human”, “woman”或 “man”结尾的字符串相匹配。
  为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。例如:
  /[A-Z]/
  上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。
  /[a-z]/
  上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。
  /[0-9]/
  上述正则表达式将会与从0到9范围内任何一个数字相匹配。
  /([a-z][A-Z][0-9])+/
  上述正则表达式将会与任何由字母和数字组成的字符串,如 “aB0” 等相匹配。这里需要提醒用户注意的一点就是可以在正则表达式中使用 “()” 把字符串组合在一起。“()”符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如 “abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。
  如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符 “|”。例如:
  /to|too|2/
  上述正则表达式将会与目标对象中的 “to”, “too”, 或 “2” 相匹配。
  正则表达式中还有一个较为常用的运算符,即否定符 “[^]”。与我们前文所介绍的定位符 “^” 不同,否定符 “[^]”规定目标对象中不能存在模式中所规定的字符串。例如:
 
 /[^A-C]/

  上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。一般来说,当“^”出现在 “[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。
  最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义符“\”。例如:
  
/Th\*/

  上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。

使用实例

  在对正则表达式有了较为全面的了解之后,我们就来看一下如何在Perl,PHP,以及JavaScript中使用正则表达式。

  通常,Perl中正则表达式的使用格式如下:

  
operator / regular-expression / string-to-replace / modifiers


  运算符一项可以是m或s,分别代表匹配运算和替换运算。

  其中,正则表达式一项是将要进行匹配或替换操作的模式,可以由任意字符,元字符,或定位符等组成。替换字符串一项是使用s运算符时,对查找到的模式匹配对象进行替换的字符串。最后的参数项用来控制不同的匹配或替换方式。例如:

  
s/geed/good/


  将会在目标对象中查找第一个出现的geed字串,并将其替换为good。如果我们希望在目标对象的全局范围内执行多次查找?替换操作的话,可以使用参数 “g”,即s/love/lust/g。

  此外,如果我们不需要限制匹配的大小写形式的话,可以使用参数 “i ”。例如,

  
m/JewEL/i


  上述正则表达式将会与目标对象中的jewel,Jewel,或JEWEL相匹配。

  在Perl中,使用专门的运算符“=~”指定正则表达式的匹配对象。例如:

  
$flag =~ s/abc/ABC/


  上述正则表达式将会把变量$flag中的字串abc替换为ABC。

  下面,我们就在Perl程序中加入正则表达式,验证用户邮件地址格式的有效性。代码如下:




  如果用户更偏爱PHP的话,可以使用ereg()函数进行模式匹配操作。ereg()函数的使用格式如下:
  
ereg(pattern, string)


  其中,pattern代表正则表达式的模式,而string则是执行查找替换操作的目标对象。同样是验证邮件地址,使用PHP编写的程序代码如下:

  <?php
   if (ereg(“^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+”,$email))
    { echo “Your email address is correct!”;}
   else
    { echo “Please try again!”;}
   ?>

  最后,我们在来看一下JavaScript。JavaScript 1.2中带有一个功能强大的RegExp()对象,可以用来进行正则表达式的匹配操作。其中的test()方法可以检验目标对象中是否包含匹配模式,并相应的返回true或false。

  我们可以使用JavaScript编写以下脚本,验证用户输入的邮件地址的有效性。

  <html>
   <head>
    <script language=\"Javascript1.2\">
     <!-- start hiding
     function verifyAddress(obj)
     {
      var email = obj.email.value;
      var pattern = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
      flag = pattern.test(email);
      if(flag)
      {
       alert(“Your email address is correct!”);
       return true;
      }
      else
       {
        alert(“Please try again!”);
        return false;
        }
      }
     // stop hiding -->
    </script>
   </head>
   <body>
   <form onSubmit=\"return verifyAddress(this);\">
   <input name=\"email\" type=\"text\">
   <input type=\"submit\">
   </form>
  </body>
 </html>


原文地址:http://clayz.javaeye.com/blog/217408

PHP面试题目 不指定

admin , 2010/08/01 10:43 , PHP , 评论(0) , 阅读(5) , Via 宝华的博客 原创
1. echo count("abc"); 输出什么?
答案是1

2. 用PHP写出显示客户端IP与服务器IP的代码
获取客户端IP:
A、

<?
$iipp=$_SERVER["REMOTE_ADDR"];
echo $iipp;
?>

B、

<?
//php获取ip的算法
if ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"])
{
$ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
}
elseif ($HTTP_SERVER_VARS["HTTP_CLIENT_IP"])
{
$ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];
}
elseif ($HTTP_SERVER_VARS["REMOTE_ADDR"])
{
$ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
}
elseif (getenv("HTTP_X_FORWARDED_FOR"))
{
$ip = getenv("HTTP_X_FORWARDED_FOR");
}
elseif (getenv("HTTP_CLIENT_IP"))
{
$ip = getenv("HTTP_CLIENT_IP");
}
elseif (getenv("REMOTE_ADDR"))
{
$ip = getenv("REMOTE_ADDR");
}
else
{
$ip = "Unknown";
}
echo "你的IP:".$ip ;


获取服务器端IP

/**
* Get Client/Server IP
*
* @author  Yaron (http://yaron.org.cn)
* @version  0.1
* @package  
*/

class getIP{
function clientIP(){
  $cIP = getenv('REMOTE_ADDR');
  $cIP1 = getenv('HTTP_X_FORWARDED_FOR');
  $cIP2 = getenv('HTTP_CLIENT_IP');
  $cIP1 ? $cIP = $cIP1 : null;
  $cIP2 ? $cIP = $cIP2 : null;
  return $cIP;
}
function serverIP(){
  return gethostbyname($_SERVER_NAME);
}
}

$getIP  = new getIP();
$clientIp = getIP::clientIP();
$serverIp = getIP::serverIP();

echo 'Client IP is ',$clientIp,'<br />';
echo 'Server IP is ',$serverIp,'<br />';


3. error_reporting(2047)什么作用?


可以参考http://agileblog.cn/error-reporting-2047/

4. echo,print()和print_r()有什么区别?

echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用)  
print只能打印出简单类型变量的值(如int,string)  
print_r可以打印出复杂类型变量的值(如数组,对象)  
echo -- 输出一个或者多个字符串  

5. 打开php.ini中的Safe_mode,会影响哪些参数?至少说出6个。

system,passthru,exec,shell_exec,popen,phpinfo等等大部分的文件操作函数。
因为Safe_mode是php非常重要的内嵌的安全机制。默认是关闭的。

6. 写个函数来解决多线程同时读写一个文件的问题。

思路:首先生成一个锁文件,读写时判断时否存在, 存在则返回假值, 不存在执行程序, 并生成一个锁文件, 程序结束删除此锁文件。


7. 请写一个函数验证电子邮件的格式是否正确(要求使用正则)
<?php
function validateEmail($email){//使用正则表达式判断Email地址是否合法的函数
return ereg("^[a-zA-Z]+@[a-zA-Z]+\.[a-zA-Z]+$",$email);
}
echo validateEmail("myname@isstudy.com");//调用验证函数
?>

非正则的代码

<?php
function validateEmail($email){//判断Email地址是否合法的函数
$hasAtSymbol=strpos($email,"@");//判断是否存在@
$hasDot=strpos($email,".");//判断是否存在点号
if($hasAtSymbol and $hasDot)// 如果包含@和点号,则返回true
return true;
else  //否则返回false
return false;
}
echo validateEmail("domain@freezingsun.com");//调用验证函数
?>


8. 考SQL语句的题,题太长了,实在不好回忆了。

9. MySQL数据库,一天一万条以上的增量,怎么优化?
做数据库负载即可。或者做数据仓库。
多台数据库服务器,设置一台为主数据库服务器,其他的为从数据库服务器。
也可参考:Query Cache 原理http://agileblog.cn/Query-Cache-Principle/

10. 写出一种排序算法(要写出代码),并说出优化它的方法。
以下是三种常见的排序算法,这些代码的话,无须优化了。可以说是一个标准的排序算法了。

<?
//插入排序(一维数组)
function insert_sort($arr){
 $count = count($arr);
 for($i=1; $i<$count; $i++){
  $tmp = $arr[$i];
  $j = $i - 1;
  while($arr[$j] > $tmp){
   $arr[$j+1] = $arr[$j];
   $arr[$j] = $tmp;
   $j--;
  }
 }
 return $arr;
}
  
//选择排序(一维数组)
function select_sort($arr){
 $count = count($arr);
 for($i=0; $i<$count; $i++){
  $k = $i;
  for($j=$i+1; $j<$count; $j++){
   if ($arr[$k] > $arr[$j])
    $k = $j;
   if ($k != $i){
    $tmp = $arr[$i];
    $arr[$i] = $arr[$k];
    $arr[$k] = $tmp;
   }
  }
 }
 return $arr;
}
  
//冒泡排序(一维数组)
function bubble_sort($array){
 $count = count($array);
 if ($count <= 0) return false;
 
 for($i=0; $i<$count; $i++){
  for($j=$count-1; $j>$i; $j--){
   if ($array[$j] < $array[$j-1]){
    $tmp = $array[$j];
    $array[$j] = $array[$j-1];
    $array[$j-1] = $tmp;
   }
  }
 }
 return $array;
}
  
//快速排序(一维数组)
function quick_sort($array){
 if (count($array) <= 1) return $array;
  
 $key = $array[0];
 $left_arr = array();
 $right_arr = array();
 for ($i=1; $i<count($array); $i++){
  if ($array[$i] <= $key)
   $left_arr[] = $array[$i];
  else
   $right_arr[] = $array[$i];
 }
 $left_arr = quick_sort($left_arr);
 $right_arr = quick_sort($right_arr);
 
 return array_merge($left_arr, array($key), $right_arr);
}
  
?>


11. 写个函数用来对二维数组排序。

public class TestSort {
public static void main(String[] args) {
   int[][] a={
     {1,1,2,4,2},
     {1,79,21,65},
     {111,23,6,2},
     {98,98,2,100}
     };
   int result=0;

   for(int i=0;i<a.length;i++)
   {
    for(int j=0;j<a[i].length;j++)
    {
     for(int k=j;k<a[i].length;k++)
     {
      int temp;
      if(a[i][j]>a[i][k])
      {
       temp=a[i][j];
       a[i][j]=a[i][k];
       a[i][k]=temp;
      }
      result++;
     }
    }
   }
   System.out.println("result="+result);
   for(int m=0;m<a.length;m++)
   {
    for(int n=0;n<a[m].length;n++)
    {
     System.out.print(a[m][n]+", ");
    }
    System.out.println();
   }
}
}



12. 写5个不同的自己的函数,来截取一个全路径的文件的扩展名,允许封装php库中已有的函数。

1. substr($sPath, -3)
2. $arPath = explode("/", $sPath); $arPath[ count($arPath)-1 ]
3. $arPath = explode(".", $sPath); $arPath[ 1 ]
4. $arPath = pathinfo( $sPath ); $arPath["extension"]
5. preg_match("/.(\w+)$/", $sPath, $arPath); $arPath[1]


13. 一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。


<?php
/**
* 猴子选大王
*
* @param int $m 猴子数
* @param int $n 出局数
* @return array
*
*/
function king($m ,$n)
{
//构造数组
for($i=1 ;$i<$m+1 ;$i++){
   $arr[] = $i ;
}
$i = 0 ;    //设置数组指针

while(count($arr)>1)
{
   //遍历数组,判断当前猴子是否为出局序号,如果是则出局,否则放到数组最后
   if(($i+1)%$n ==0) {
    unset($arr[$i]) ;
   } else {
    array_push($arr ,$arr[$i]) ; //本轮非出局猴子放数组尾部
    unset($arr[$i]) ;   //删除
   }
   $i++ ;
}
return $arr ;
}

var_dump(king(6,4));

error_reporting(2047)什么作用 不指定

admin , 2010/08/01 09:54 , PHP , 评论(0) , 阅读(6) , Via 宝华的博客 原创
error_reporting 设定错误讯息回报的等级
2047我记得应该是E_ALL。

php.ini 文件中有许多配置设置。您应当已经设置好自己的 php.ini 文件并把它放在合适的目录中,就像在 Linux 上安装 PHP 和 Apache 2 的文档说明中所示的那样(请参阅 参考资料)。在调试 PHP 应用程序时,应当知道两个配置变量。下面是这两个变量及其默认值:
display_errors = Off
error_reporting = E_ALL

E_ALL能从不良编码实践到无害提示到出错的所有信息。E_ALL 对于开发过程来说有点太细,因为它在屏幕上为一些小事(例如变量未初始化)也显示提示,会搞糟浏览器的输出
所以不建议使用2047,最好把默认值改为:error_reporting = E_ALL & ~E_NOTICE


2047 = E_X | E_Y |.....

1 E_ERROR  
2 E_WARNING  
4 E_PARSE  
8 E_NOTICE  
16 E_CORE_ERROR  
32 E_CORE_WARNING  
64 E_COMPILE_ERROR  
128 E_COMPILE_WARNING  
256 E_USER_ERROR  
512 E_USER_WARNING  
1024 E_USER_NOTICE  

2048 E_STRICT  
6143 E_ALL  
4096 E_RECOVERABLE_ERROR  
8192 E_DEPRECATED  
16384 E_USER_DEPRECATED  

似乎是E_STRICT之前所有的累积啊


思路:2047 = 1024 + 512 + 256 + 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1

工作流系统主要的概念 不指定

admin , 2010/07/31 18:33 , Java开发 , 评论(0) , 阅读(11) , Via 宝华的博客 原创
本文永久链接:http://agileblog.cn/Work-Flow-System/
流程定义:预先定义的业务流程逻辑
流程实例:业务的一次实际流转过程
参与者:任务的执行者
活动(任务):组成流程定义的节点
活动实例:组成流程实例的元素
流转:从一个节点到另一个节点这一行为
工作列表:当前需要办理的任务集合
工作了引擎:工作流的核心组件,对流程实例、任务实例以及其状态进行管理。


工作流系统研究切入点

1、如何编写流程定义
2、如何部署流程
3、如何加载流程
4、如何启动流程
5、如何执行任务
6、如何完成任务

编写工作流引擎的步骤
1、创建流程定义
2、部署流程定义
3、启动流程实例
4、获取任务列表
5、执行任务
6、结束任务

WordPress永久链接格式对比及设置参考(转) 不指定

admin , 2010/07/31 07:53 , SEO , 评论(0) , 阅读(16) , Via 宝华的博客 原创
本文地址:http://agileblog.cn/Permalink/
WordPress永久链接又叫固定链接,官方称Permalink,就是对日志、分类、标签等URL路径进行友好格式化显示,也就是看起来舒服一点,更方便搜索引擎的收录和分析,而真正意义上的固定链接,应该是伴随着静态化的,合理的URL结构会让日志、分类和标签管理更加合理,更加方便归类和整理,比如Windows方面文章放到Windows目录下,汽车方面文章放到auto下当然更加合理,既然Wordpress使用的都是伪静态或说伪动态,那么URL永久链接就纯粹为了好看和搜索引擎优化,优点就是实时生效,天缘博客则是真静态化,整体设置只要修改就要刷新全部静态页,各有优缺点。

一、Wordpress固定链接全是假的
这个标题有点外行,只是为了方便理解,实际上应该叫Mod Rewrite,打个比方就是网上很多IDC留下的电话号码,为了给别人大、正规的假象,往往设置很多分机,比如888888-741、888888-874等等,实际上,你打任何分机过去,可能都是一个人在接,公司也可能只有一个员工,这堆分机放到本文理解就是Mod Rewrite。这个员工就是index.php。

使用WordPress永久链接的前提,要求所在主机必须支持Mod Rewrite重写。

WordPress默认URL格式:

/?p=postid

/?cat=cateid

/?tag=mytag

这三种类型地址格式是真的,根下的index.php确实存在这些参数的接收和处理,所以即使没有重写功能,也并不影响这类默认URL格式使用,但如要使用自定义的固定链接格式,则必须具有Rewrite功能,否则会全部报告404错误。

二、如何设置WordPress永久链接
登录到WordPress后台,然后点击左侧工具栏菜单Setting(设置)-》Permalink Setting(固定链接)

固定链接包含两个部分:

日志路径——有五个选项,默认格式就是上文提到的动态参数格式。

分类和标签路径——只有日志处于默认设置时,分类和标签默认路径才是上文的动态参数形式。

日志永久链接包括的标签变量有:

%year%、 %monthnum%、%day% 、%hour% 、%minute% 、%second%——分别代表年月日时分秒

%post_id%——日志ID

%postname%——日志别名

%category%——日志分类

%tag%——日志标签

%author%——日志作者

由于分类和标签URL格式,可能会随着日志永久链接变化而变化,所以设置设置好日志永久链接后一定要检查分类和标签链接格式是否合意,否则需对应修改,修改方法参考下文,或结合官方说明地址。

三、WordPress日志永久链接设置

1、若非特殊用途,%hour% 、%minute% 、%second%和%author%、%category%、%tag%慎用,感觉对个人博客完全没有必要,WordPress似乎纯粹为了功能完整性而设计出来。如果日志URL中带有%category%和%tag%,某天日志分类或标签被修改掉,URL可能就会变化。

2、%year%、 %monthnum%、%day%建议只在多人博客或多具有时效性日志的博客上使用,当博客上每天都多篇日志或具有时效性的新闻发布时,可以考虑这种格式,典型URL格式如下:

/%year%/%monthnum%/%postname%

/%year%/%monthnum%/%day%/%postname%



/%year%/%monthnum%/%postname%/

/%year%/%monthnum%/%day%/%postname%/

这四种格式,后面两种可以在上面图中直接选择,上面自定义一下,去掉反斜线即可,如果你的日志并不多,没必要使用此种格式。

3、个人博客建议下面三种形式之一:

方式1:

/archives/%postname%.html

/archives/%post_id%.html

/%postname%.html

——这三种看起来比较标准,对搜索引擎也比较友好。其中archives也可换成自己喜欢的单词,比如blog等,也可把尾标换成.html、.htm、.php等,也可自定义尾标。把路径直接定位到网站根目录的(第三种),在很多国外网站上也很常见。

方式2:

/archives/%post_id%

/archives/%postname%

/%postname%

——这三种地址更短一点,看起来也很不错,打算一直似乎也Wordpress的用户可以优先考虑,如果哪天换系统或突然主机不支持重写了可能会带来麻烦。

方式3:

/archives/%post_id%/

/archives/%postname%/

/%postname%/

——个人感觉这三种地址最古怪,据说对搜索引擎更好,还是认为带个直接没有反斜杠或带个尾标似乎更好。因为那样更像一个标准的路径及目标文件名,而且带尾标的的路径即使在不支持MOD REWRITE的主机上也很容易实现“真静态”。

另外,类似/index.php/2010/06/27/windows-7/这样的地址就更不要采用了,已经完全脱离URL的样子,太另类了。

更多讨论:天缘征询:关于博客日志、分类和归档目录路径的讨论

四、WordPress分类及标签永久链接设置
默认的分类和标签路径也都是动态的,所以一旦修改了日志永久链接,默认的WordPress分类及标签链接可能也会变化,需注意检查。

假设日志路径选择的是/archives/%post_id%.html,下面的分类和标签路径可能默认如下:

/archives/category/mycate

/archives/tag/mytag

很明显,这个默认路径有点长,如果再存在二级分类,那么URL很容易超过四五级,可以改成下面的样子(如上文插图,试验一下就知道):

设置为“category”后:/category/windows-7

设置为“tag”后:/tag/mytag

这样的路径更简短一些,这样从访客角度看来,日志放到archives(blog)目录下,分类放到category目录下,标签放到tag目录下,各得其所,非常明了。

五、关于WordPress永久链接的几点事项
1、最好不要在URL中出现中文,天缘也看到有些博客的URL使用到中文字符串,可能是为了方便,也可能是个人爱好,多字节字符作为URL就像是“.中国”域名那样,还有中文网址,毕竟太中国特色,在互联网上还是抛弃掉吧。

2、是否设置为伪静态URL格式,比如带.html等扩展名,看个人爱好。

3、链接深度不要太多,十不过三最好不要超过三级、带子分类别超过四级,每天有多篇文章更新的博客的,可以考虑带年月日的URL路径,个人博客写不了那么多篇原创文章的,就无需使用年月日URL。比如天缘目前使用的archives/id.html格式,也可使用blog/post-name.html格式,对个人博客足够使用的了。

4、是否使用post_id也要看个人爱好了,因为WordPress跟zblog还不同,自动保存草稿、页面等都保存在一个数据表中,所以这个ID是不连续的,所以博客路径看起来很不爽(可能天缘有洁癖,呵呵,总希望ID是连续的),所以使用WordPress还是建议使用postname,尤其是英文博客几乎清一色的都是有postname,中文博客可能对英文有点要求,也可以找找插件,要么就用id了,汉语拼音用在URL上怎么讲还是有点长。

5、永久链接在博客建立之初就需设置好,一经设置就最好别动了,错就错到底就是没有错。

转载自 天缘博客 及本文链接地址:http://www.metsky.com/archives/467.html

使用JS做基本的页面验证 不指定

admin , 2010/07/30 22:16 , JavaScript , 评论(0) , 阅读(16) , Via 宝华的博客 原创
本文永久链接:http://agileblog.cn/Using-javascript-to-do-basic-verification-page/

不能为空
<input onblur="if(this.value.replace(/^ +| +$/g,'')=='')alert('不能为空!')">


只能输入英文和数字
<input onblur="if(/[^0-9a-zA-Z]/g.test(value))alert('有错')">
<input onkeyup="value=value.replace(/[^0-9a-zA-Z]/g,'')"/>
<input type="text" onkeyup="value=value.replace(/[^\a-\z\A-\Z0-9]/g,'')">

判断字符由字母和数字,下划线,点号组成.且开头的只能是下划线和字母
/^([a-zA-z_]{1})([\w]*)$/g.test(str)


只能输入数字
<input name="text" type="text" id="NewPage" onKeyUp="value=value.replace(/\D/g,'')" onafterpaste="value=value.replace(/\D/g,'')" >

只能输入中文
<input type="text" onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')">


只能输入英文
<input type="text" onkeyup="value=value.replace(/[^\a-\z\A-\Z]/g,'')">
<input type="text" onkeyup="value=value.replace(/[^a-zA-Z]/g,'')">

只能输入中文、英文、数字、@符号和.符号
<input type="text" onkeyup="value=value.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5\@\.]/g,'')">


只允许输入英文,且不能粘贴也无法弹出粘贴菜单

<input type="text" onkeyup="value=value.replace(/[^\a-\z\A-\Z]/g,'')" onkeydown="fncKeyStop(event)" onpaste="return false" oncontextmenu = "return false"/>

只能输入数字和点号(注意:在[^\d\.]里的d不能写成大写D,否则就变成除了数字以外的所有字符)
<input type="text" size="8" maxlength="8" >

总而言之:先在<input>里输入onkeyup="value=value.replace(/[^\X]/g,'')" 然后在(/[\X]/g,'')里的X换成你想输入的代码就可以了

中文:u4E00-u9FA5
数字:d、0-9
英文:a-z、A-Z
其它符号@,点或其它符号.也可以多个,用\隔开就行了.
例如:
中、英文和数字加@符号加点符号:\a-\z\A-\Z0-9\u4E00-\u9FA5\@\.

若想在文本框里不能右键弹出菜单和不能粘贴进复制的信息的话就要在<input>里输入 onKeyDown="fncKeyStop(event)" onpaste="return false" oncontextmenu="return false;"

做一个Oracle数据库管理员应该做到的 不指定

admin , 2010/07/30 22:00 , Java开发 , 评论(0) , 阅读(13) , Via 宝华的博客 原创
本文永久地址:http://agileblog.cn/Oracle-DBA-How-do-Work/
如何做好Oracle数据库管理员Oracle数据库管理员应按如下方式对Oracle数据库系统做定期监控:

(1).每天 对Oracle数据库的运行状态,日志文件,备份情况,数据库的空间使用情况,系统资源的使用情况进行检查,发现并解决问题。

(2).每周 对数据库对象的空间扩展情况,数据的增长情况进行监控,对数据库做健康检查,对数据库对象的状态做检查。

(3).每月 对表和索引等进行Analyze,检查表空间碎片,寻找数据库性能调整的机会,进行数据库性能调整,提出下一步空间管理计划。对ORACLE数据库状态进行一次全面检查。

每天的工作

(1).确认所有的INSTANCE状态正常登陆到所有数据库或例程,检测ORACLE后台进程: $ps –ef|grep ora

(2).检查数据文件的状态记录状态不是“online”的数据文件,并做恢复。  

Select file_name, status
from dba_data_files
where status=’UNAVAILABLE’;

(3).检查日志文件和trace文件记录alert和trace文件中的错误。

连接到每个需管理的系统

使用‘telnet’
对每个数据库,cd到bdump目录,通常是
$ORACLE_BASE//bdump

使用Unix‘tail’命令来查看alert_.log文件
如果发现任何新的ORA-错误,记录并解决。
(4).检查数据库当日备份的有效性。

对RMAN备份方式: 检查第三方备份工具的备份日志以确定备份是否成功

对EXPORT备份方式: 检查exp日志文件以确定备份是否成功

对其他备份方式: 检查相应的日志文件

(5).检查文件系统的使用(剩余空间)。如果文件系统的剩余空间小于20%,需删除不用的文件以释放空间。

$df –k

(6).检查表空间的使用情况  

SELECT tablespace_name, max_m, count_blocks free_blk_cnt, sum_free_m,to_char(100*sum_free_m/sum_m, '99.99') &#124;&#124; '%' AS pct_free
FROM (SELECT tablespace_name,sum(bytes)/1024/1024 AS sum_m
FROM dba_data_files
GROUP BY tablespace_name),
(SELECT tablespace_name AS fs_ts_name, max(bytes)/1024/1024 AS max_m, count(blocks) AS count_blocks, sum(bytes/1024/1024) AS sum_free_m
FROM dba_free_space
GROUP BY tablespace_name )
WHERE tablespace_name = fs_ts_name;

(7).检查剩余表空间

SELECT tablespace_name, sum ( blocks ) as free_blk , trunc ( sum ( bytes ) /(1024*1024) ) as free_m,
max ( bytes ) / (1024) as big_chunk_k, count (*) as num_chunks
FROM dba_free_space
GROUP BY tablespace_name;

(8).监控数据库性能

运行bstat/estat生成系统报告或者使用statspack收集统计数据

(9).检查数据库性能,记录数据库的cpu使用、IO、buffer命中率等等

使用vmstat,iostat,glance,top等命令

(10).日常出现问题的处理。

每周的工作

(1).监控数据库对象的空间扩展情况

根据本周每天的检查情况找到空间扩展很快的数据库对象,并采取相应的措施:

--删除历史数据

扩表空间
alter tablespace add datafile ‘’ size

调整数据对象的存储参数

next extent
pct_increase


(2).监控数据量的增长情况

根据本周每天的检查情况找到记录数量增长很快的数据库对象,并采取相应的措施:

删除历史数据

扩表空间

alter tablespace add datafile ‘’ size


(3).系统健康检查

检查以下内容: 

init.ora
controlfile
redo log file
archiving
sort area size
tablespace(system,temporary,tablespace fragment)
datafiles(autoextend,location)
object(number of extent,next extent,index)
rollback segment
logging &tracing(alert.log,max_dump_file_size,sqlnet)

(4).检查无效的数据库对象 

col owner for a20
col object_name for a30
SELECT owner, object_name, object_type
FROM dba_objects
WHERE status= ’INVALID’;


(5).检查不起作用的约束  

SELECT owner, constraint_name, table_name, constraint_type, status
FROM dba_constraints
WHERE status = 'DISABLED’ AND constraint_type = 'P' ;


(6).检查无效的trigger 

SELECT owner, trigger_name, table_name, status
FROM dba_triggers
WHERE status = 'DISABLED’;


每月的工作

(1). Analyze Tables/Indexes/Cluster 

analyze table estimate statistics sample 50 percent;


(2).检查表空间碎片

根据本月每周的检查分析数据库碎片情况,找到相应的解决方法;

(3).寻找数据库性能调整的机会

比较每天对数据库性能的监控报告,确定是否有必要对数据库性能进行调整;

(4).数据库性能调整

如有必要,进行性能调整;

(5).提出下一步空间管理计划

根据每周的监控,提出空间管理的改进方法;
本文永久链接:http://agileblog.cn/Notebook-not-install-the-system/
问题描述

光驱中插入一张操作系统盘,采用光驱启动,加载系统配置文件,到达系统安装的时候,却发现不了硬盘,并提示:
安装程序没有找到安装在此计算机的硬盘驱动器。
请确认硬盘驱动器已接通电源,并且跟计算机连接是正确的;
同时,确认与磁盘有关的硬件配置是正确的。
这可能需要运行制造厂商提供的诊断程序或安装程序。
安装程序无法继续,要退出安装程序,请按F3。

遇到以上问题,其实并不是系统盘的问题,也不是笔记本硬盘线真的插好,而是因为你的主板芯片是965的,采用的是串口硬盘,只有采用IDE方式连接硬盘才可以解决该问题。
具体如何解决呢?
首先:重新启动电脑
这个是在装系统时提示的  解决方法是 可以开机进BIOS设置 关掉串口模式
开机按F2键,进入BIOS设置
关掉串口模式
就可以顺利安装了

Error xvidcore.dll not found 不指定

admin , 2010/07/29 16:34 , Windows , 评论(0) , 阅读(32) , Via 宝华的博客 原创
本文永久链接地址:http://agileblog.cn/xvidcore-dll/
用卡巴斯基杀毒软件杀毒之后,打开有媒体文件的文件夹,Windows就弹出来一个窗口,提示Error xvidcore.dll not found。
xvidcore.dll是一个媒体文件支持库,一般安装完媒体播放器之后,都会存在于操作系统的Windows/system32文件夹下。但是有时候因为播放媒体文件而导致xvidcore.dll 文件进行感染,所以每次杀毒的时候,杀毒软件都会将其当做病毒杀掉的。
以下是弹出窗口的截图:
点击在新窗口中浏览此图片
解决该问题的办法是下载一个xvidcore.dll 文件,并将其拷贝到系统盘下的Windows目录的system32文件夹下。我的操作系统是system32文件夹下,有些系统是Windows目录下,你可以查看一下,Windows文件夹下哪个文件夹下很多.dll的文件,就拷贝过去就可以了。
以下是本博客提供文件的下载地址:
下载文件 (已下载 10 次)

将网站搬到自己的电脑上 不指定

admin , 2010/07/27 10:34 , 服务器技术 , 评论(0) , 阅读(53) , Via 宝华的博客 原创
最近注册了几个免费的域名,并且都绑定到了VPS里面去了,由于自己VPS是在国外,在国内访问不怎么理想,所以想把网站程序部署到自己的电脑里面来。这样自己就非常的好维护网站,只需在本地维护就可以了,并且通过公网可以访问到最新修改的程序,这对于我们项目组以后一起异地开发程序要非常的好。并且公司这边提供的是2M的带宽,一个网站完全可以满足,不过毕竟自己的电脑不是服务器,还是需要休息的,所以访问网站的话,也只能是我在线的时候才可以访问的。
今天我只是实现了通过域名访问我电脑上的tomcat服务器
以后还会实现DNS服务器的搭建的
以下是需要的设备:
1、一台电脑
2、一条宽带
3、一个moden
4、一个路由
首先必须保证能联网,要不然一切都是扯淡。
我这边的路由是TENDA的W311R无线路由。
第一步:登录路由
http://192.168.0.254
我修改了默认的IP地址
默认的登录地址是:192.168.0.1
默认帐号:admin
默认密码:admin
说明一下:我这使用的是路由拨号上网,要是你直接用电脑拨号上网的话,就没有以下的操作,只需看一下你的IP即可。
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
我个人电脑的IP是192.168.0.100
WEB服务器采用的是TOMCAT,WEB服务器的端口是80,刚好是HTTP的默认端口。
修改Tomcat端口可以到Tomcat 6.0\conf\文件夹下的server.xml文件中修改
具体的修改是搜索8080,再修改成80即可
以下是修改的代码

<Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

这些配置好后,你可以通过IP直接访问服务器,检查服务器是否正常运行。
浏览:http://118.249.151.74 及可
你们访问自己电信分配的IP即可
具体查看可以到路由器中查看状态里面会显示的。

接下来是把域名解析到电脑上来,要是没有域名的,可以到http://www.dot.tk去注册一个顶级的免费域名。具体的注册流程就不多说了。

里面有DNS管理,直接使用dot.tk的DNS服务器,到DNS服务器里面添加A记录即可,将域名转发到自己的IP即可。我之前注册了几个.tk的免费域名,现在只需到VPS里面的DNS服务器里面进行添加相应的记录即可。
添加A记录也不列举出来了。

添加记录之后,稍等片刻,就可以通过域名访问你在本地建立的站点了,你也可以邀请别人访问你的站点。
我已经做好了一个,你可以通过http://middleware.tk访问我电脑里面的网站了。
以下是截图:
点击在新窗口中浏览此图片
分页: 1/18 第一页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]