遇到的几个Php问题

1.Zend Stdio中Ctrl+鼠标左键以及F3都无法定位Php源代码。

可能的方案:

a.引自http://www.exploit.cz/php/zend-studio-code-autocomplete-fix.html 删除用户目录Zend文件夹中的org.eclipse.dltk.ui.prefs文件重启一下就ok了;(我当初重新装了Ubuntu,Zend文件夹是从原来电脑拷贝过来,而且新系统使用了新的Zend Stdio版本。可能跟这个有关)

b.右键点击项目 -> configure -> Add PHP Support试试。

 

2.发现Php中正则替换函数preg_replace有一个很强大的功能:除了字符串正则替换还能够把replacement当作php code来运行(如果replacement是函数其参数可以通过占位符从正则匹配到的原字符串获取,参数的使用方式有点像apache的rewrite)。

The e modifier makes preg_replace treat the replacement parameter as PHP code after the appropriate references substitution is done. Tip: make sure that replacement constitutes a valid PHP code string, otherwise PHP will complain about a parse error at the line containing preg_replace.

 

以下内容来源:http://blog.sina.com.cn/s/blog_64e2219d01010299.html

 $post=preg_replace("/\[html\](.+?)\[\/html\]/eis","htmlcode('\\1')",$post);
修饰符:
在正则表达式里面的修饰符可以改变正则的很多特性,使得正则表达式更加适合你的需要(注意:修饰符对于大小写是敏感的,这意味着"e"并不等于"E")。正则表达式里面的修饰符如下:
i :如果在修饰符中加上"i",则正则将会取消大小写敏感性,即"a"和"A" 是一样的。
m:默认的正则开始"^"和结束"$"只是对于正则字符串如果在修饰符中加上"m",那么开始和结束将会指字符串的每一行:每一行的开头就是"^",结尾就是"$"。
s:如果在修饰符中加入"s",那么默认的"."代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符!
x:如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。
e:本修饰符仅仅对于replacement有用,代表在replacement中作为PHP代码。
A:如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说"/a/A"匹配"abcd"。
E:与"m"相反,如果使用这个修饰符,那么"$"将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。
U:和问号的作用差不多,用于设置"贪婪模式"。
?表单非贪婪匹配,即尽可能少的匹配

#############
##总结模型###
#############
1.直接在preg_replace第2个变量执行的模式:
echo preg_replace("/test/e",$h,"jutst test");
?>
提交http://127.0.0.1/test/11/preg.php?h=phpinfo()
实例如:phpbb的viewtopic.php变量$highliht_match提交php代码执行漏洞

2.通过\\1[或者\\n]提取第3个变量里的php代码并执行的模式:
echo preg_replace("/\s*\[php\](.+?)\[\/php\]\s*/ies", "\\1", $h);
?>
提交:http://127.0.0.1/test/11/preg.php?h=[php]phpinfo()[/php]

preg_replace与ereg_replace那个效率更高

  编程序,总有一种感觉,去年的程,到了今年,总感觉慢了好多,应该这就是优化所在,自己的知识更深,技术也在更,所以每过一段时间,再读读您写 的程序,看有没有可以优化的地,这是一个程序员应该做的行动。preg_replace()是Perl内置的一种文字匹配模式,不过用起来一些参数会比 ereg_relace()复杂一些,实际的项目运用中,用ereg的人还是不,近日我写了一个获取HTML中的文本的函数,发现 preg_replace()居然比ereg_replace()快了近一倍,两个函数如下:

用preg_replace()
引用代码:function GetHtmlText($str)
{
$str = preg_replace("/<sty(.*)\/style>|<scr(.*)\/script>|<!--(.*)-->/isU","",$str);
$alltext = "";
$start = 1;
for($i=0;$i<strlen($str);$i++){
    if($start==0 && $str[$i]==">") $start = 1;
    else if($start==1){
    if($str[$i]=="<"){ $start = 0; $alltext .= " "; }
    else if(ord($str[$i])>32) $alltext .= $str[$i];
    }
}
$alltext = preg_replace("/&([^;&]*)(;|&)/"," ",$alltext);
$alltext = preg_replace("/ {1,}/"," ",$alltext);
$alltext = preg_replace("/ {1,}/"," ",$alltext);
return $alltext;
}

用ereg_replace()
引用代码:function GetHtmlText($str)
{
$str = eregi_replace("<sty(.*)/style>|<scr(.*)/script>|<!--(.*)-->","",$str);
$alltext = "";
$start = 1;
for($i=0;$i<strlen($str);$i++){
    if($start==0 && $str[$i]==">") $start = 1;
    else if($start==1){
    if($str[$i]=="<"){ $start = 0; $alltext .= " "; }
    else if(ord($str[$i])>32) $alltext .= $str[$i];
    }
}
$alltext = ereg_replace("&([^;&]*)(;|&)"," ",$alltext);
$alltext = ereg_replace(" {1,}"," ",$alltext);
$alltext = ereg_replace(" {1,}"," ",$alltext);
return $alltext;
}

  经过多次测试对,用preg_replace()的函数普遍在 0.08-0.12秒之间,用ereg_replace()的函数却去到0.35-0.38秒之间,测试的网页为百度的主页,我的系统是图拉丁 1.1G的CP,384M的内存。
  如果你的程序中还有使用ereg处理较长文本的,建议马上更改过来。

 

你可能感兴趣的:(PHP)