手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2009年03月的文章

php正则表达式中的模式修正符

手册里也有,只是是英文版的,看到有中文的,就复制回来,做备份了。

下面列出了当前在 PCRE 中可能使用的修正符。括号中是这些修正符的内部 PCRE 名。修正符中的空格和换行被忽略,其它字符会导致错误。

    i (PCRE_CASELESS)
        如果设定此修正符,模式中的字符将同时匹配大小写字母。

    m(PCRE_MULTILINE)
        默认情况下,PCRE 将目标字符串作为单一的一“行”字符所组成的(甚至其中包含有换行符也是如此)。“行起始”元字符(
^)仅仅匹配字符串的起始,“行结束”元字符($)仅仅匹配字符串的结束,或者最后一个字符是换行符时其前面(除非设定了 D 修正符)。这和 Perl 是一样的。

        当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。这和 Perl 的 
/m 修正符是等效的。如果目标字符串中没有“\n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。

    s(PCRE_DOTALL)
        如果设定了此修正符,模式中的圆点元字符(
.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。这和 Perl 的 /s 修正符是等效的。排除字符类例如 [^a] 总是匹配换行符的,无论是否设定了此修正符。

    x(PCRE_EXTENDED
        如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 
# 以及下一个换行符之间的所有字符,包括两头,也都被忽略。这和 Perl 的 /x 修正符是等效的,使得可以在复杂的模式中加入注释。然而注意,这仅适用于数据字符。空白字符可能永远不会出现于模式中的特殊字符序列,例如引入条件子模式的序列 (?( 中间。

    e       如果设定了此修正符,
preg_replace() 在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。

        只有 
preg_replace() 使用此修正符,其它 PCRE 函数将忽略之。

            注意
: 本修正符在 PHP3 中不可用。

    A(PCRE_ANCHORED)
        如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配。此效果也可以通过适当的模式本身来实现(在 Perl 中实现的唯一方法)。

    D(PCRE_DOLLAR_ENDONLY)
        如果设定了此修正符,模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前(但不会匹配任何其它换行符之前)。如果设定了 m 修正符则忽略此选项。Perl 中没有与其等价的修正符。

    S        当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non
-anchored 模式有用。

    U(PCRE_UNGREEDY)
        本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“
?”才变得重复。这和 Perl 不兼容。也可以通过在模式之中设定 (?U) 修正符或者在数量符之后跟一个问号(如 .*?)来启用此选项。

    X(PCRE_EXTRA)
        此 修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将 来扩充。默认情况下,和 Perl 一样,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。当前没有其它特性受此修正符控制。

    u(PCRE_UTF8)
        此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF
-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起开始检查模式的 UTF-8 合法性。

Tags: 正则, 模式修正符

ZF在ubuntu下的运行

ZEND FRAMEWORK要想正常的在ubuntu的AMP平台下运行 ,得打开apache的rewrite模块。这和windows下面把rewrite前的注释去掉可不一样。

进入命令行:a2enmod rewrite

会提示你成功打开rewrite模块

然后:

/etc/init.d/apache2 force-reload

重新加载一下,不过,这样还是不能成功的,因为默认的virtualhost中 有一个参数的值默认为NONE,要改成ALL

运行 :

vim /etc/apache2/sites-enabled/000-default

修改 

        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>
把AllowOverride None 的 None 改为 All

然后

/etc/init.d/apache2 restart

OK,现在运行ZEND的例子,正常了吧,呵呵

Tags: zend, framework, ubuntu, rewrite

zf的paginator的疑问

如果按照ZEND的手册,在使用Zend_Paginator类的时候有两种方法,一种是直接new,一种是用factory
当然,用factory是很方便的。只需要Zend_Paginator::factory( $array )就行了
可是,如果这个array很大怎么办?它没有说。。
即使是new Zend_Paginator( Zend_Db_xxx ?$array )[不记得括号中是哪个abstract了],如果数据量大,他也没办法的呀??

今天白天我试着一下子查询了1W多条,立马死掉。
我看网上的例子,大多是要么直接传结果,要么是传 ZEND_DB的查询对象进去。但结果集都不大的,所以顺利运行 了。我不知道结果集是上万的时候会怎么样,呵呵

最后我是采用了先COUNT出总数,然后用range生成一个大数组传组 Zend_Paginator::factory() ,因为我看他里面的计数是用count的,所以我对factory的数组参数就直接传了这个range出来的数组给它。

结果,成功了,看来,这也就可以了。只是方法有点妖而己。。

记录一下,备忘一下。

Config文件
[paginator]
page.pagemax = 10
page.pagestart = 1
page.itemperpage = 25

在文件里

PHP代码
  1. <?php  
  2. //...前面略  
  3. $request = $this->_request ;  
  4. $currentPage = $request->getParam('page');  
  5. $result = $table->fetchAll( ... 条件 );  
  6. $resultCount = $table->getCount( ... 条件 ); //文件自己实现  
  7. $resultCountArray = range( 1, $resultCount ); //到底是从0到resultCount-1好,还是直接从1到$resultCount好,我没有仔细测试过  
  8.   
  9. $paginator = Zend_Paginator::factory( $resultCountArray );  
  10. $paginator->setCurrentPage( $currentPage )  
  11.                 ->setItemPerPage( 25 )      //这个方法可能写错了,我是凭记忆写的,请看手册  
  12.                 ->setPageRange( 10 );  
  13. $this->view->paginator = $paginator;  

部分参数在获取失败的情况下,会直接从Config文件里读取,这里就不详细写了,大致应该是:

PHP代码
  1. <?php  
  2. //.....略  
  3. $config = new Zend_Config_Ini('...path...' , 'paginator' ); //即Config中[]包含的文字  
  4.   
  5. $pageMax = $config->page->pagemax ;  
  6. //取出来的每条数据都是对象了  

Tags: zend, framework, paginator

笔记:chgrp、chown、chmod和tar打包的用法

这四个命令可能用的最多的还是chmod,改变权限

该命令在PHP中有模拟实现,在linux下使用方法大致为
chmod -R 0777 目录名

参数 -R 表示遍历

该变目录的所有者
chown -R aaa.bbb 目录名
-R同样为遍历 aaa为组bbb为用户

chgrp 好象没有-R 功能,用法与chown一样

tar功能常用的就是解压和打包

解压时,大多为tar zxvf xxxx.tar.gz

打包时:tar zxvf xxx.tar.gz 目标目录

Tags: linux, chgrp, chown, chmod, tar

笔记:在Ubuntu中设置samba共享可读写文件夹

在ubuntu SERVER最初创建的时候就可以选择samba进行安装,如果你没有安装过,那就先运行
apt-get install samba
在网上看到还有资料写需要安装smbfs,不知道有没有什么用。

安装成功后,进入samba目录:/etc/samba
先备份,smb.conf文件
cp smb.conf smb.conf.bak
然后打开smb.conf
找到 ; security = user
把前面的分号注释掉,再加上一行
username map = /etc/samba/smbusers
(这个文件是不存在的,到时候需要单独建立)

还在smb.conf文件里,找到[global]
默认在ubuntu里面workgroup = WORKGROUP,好象说有的版本是 workgroup = MSHOME,如果是这种就改为WORKGROUP吧,毕竟在XP里面工作组都是workgroup
再加上:
display charset = UTF-8
unix charset = UTF-8
dos charset = cp936

再到文件的结束处加上
[www]
comment = '这是该共享的注释'
path = /var/www
public = yes
writable = yes
valid users = www
create mask = 0777
directory mask = 0777
force user = nobody
force group = nogroup
available = yes
browseable = yes

保存退出。
然后打开smbusers文件,加入
www = "netwok username"
保存退出

运行
useradd www
添加一个Www用户
再运行smbpasswd -a www
为www的访问设定一个密码

现在就OK了,使用testparm看一下smb的情况
最后/etc/init.d/samba restart
重启。
OVER
在windows下面就可以访问了。。。

下面是对配置的简单注释
[www]     //这是共享时显示的名称
comment = '这是该共享的注释'   //注释
path = /var/www  //路径
public = yes          //是否开放
writable = yes       //是否可写
valid users = www //访问的用户
create mask = 0777   //创建权限 (0777为最大权限)
directory mask = 0777 //目录权限
force user = nobody    //目标用户
force group = nogroup//目标组
available = yes              //是否启用
browseable = yes         //是否可浏览

Tags: ubuntu, samba

Records:53«234567891011