preg_match

php5.3开始出现的Function ereg() is deprecated Error问...

99封情书 提交于 2019-12-05 08:49:00
PHP 5.3 ereg() 无法正常使用,提示“Function ereg() is deprecated Error”。问题根源是php中有两种正则表示方法,一个是posix,一个是perl,php6打算废除posix的正则表示方法所以后来就加了个preg_match。此问题解决办法很简单,在ereg前加个过滤提示信息符号即可:把ereg()变成@ereg()。这样屏蔽了提示信息,但根本问题还是没有解决,php在5.2版本以前ereg都使用正常,在5.3以后,就要用preg_match来代替ereg。所以就需要变成这样,原来: ereg ( " ^[0-9]*$ " , $page ) 变成: preg_match ( " /^[0-9]*$/ " , $page ) 特别提醒:posix与perl的很明显的表达区别就是是否加斜杠,所以与ereg相比,后者在正则的前后分别增加了两个”/”符号,不能缺少。 Tips:此问题在php5.2之前版本不会出现。 来源: oschina 链接: https://my.oschina.net/u/187928/blog/36817

PHP正则匹配汉字

[亡魂溺海] 提交于 2019-12-04 15:47:30
我使用正则表达式来匹配中问的时候,出现了无法匹配的问题,问题如下 PCRE does not support \L, \l, \N{name}, \U, or \u at offset 2 我原来的匹配公式是: /[\u4e00-\x9fa5]/ 然后我在网上找的,下面的解决方案 解决后的匹配方案是: /^[\x{4e00}-\x{9fa5}]+$/u 下面是具体文章 在做表单验证时对用户姓名的验证规则有以下要求 要求:输入的内容需要满足的条件是: 1.允许输入字符:数字(0-9)、字母(a-z和A-Z)、汉字、下划线( )、圆点(.)和空格; 2、姓名中间允许有空格; 3、下划线、圆点和空格均为英文状态输入法下的字符; 4、姓名前后不允许输入下划线、圆点、空格和特殊字符 $str = 'abc测试 ef'; if(preg_match('/^[a-zA-Z0-9\u4e00-\u9fa5]+$|^[a-zA-Z0-9\u4e00-\u9fa5][a-zA-Z0-9 \s\ \u4e00-\u9fa5.]*[a-zA-Z0-9\u4e00-\u9fa5]+$/',$str)){ echo "符合验证规则"; }else{ echo "不符合验证规则"; } 执行时报错:Severity: Warning Message: preg_match() [function.preg

preg_match 第三个参数,

微笑、不失礼 提交于 2019-12-03 05:13:36
//请修改变量p的正则表达式,使他能够匹配str中的姓名 $p = '/name:([\w\s]+)/'; $str = "name:steven jobs"; preg_match($p, $str, $match); print_r($match);Array ( [0] => name:steven jobs [1] => steven jobs )    //?????? 来源: https://www.cnblogs.com/pansidong/p/11779552.html

“Unknown modifier 'g' in…” when using preg_match in PHP?

匿名 (未验证) 提交于 2019-12-03 01:48:02
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 问题: This is the regex I'm trying to use: /^(\w|\.|-)+?@(\w|-)+?\.\w{2,4}($|\.\w{2,4})$/gim I found it on this site , and it works great when I try it out there. But as soon as I place it in my code, I get this message: Warning: preg_match() [function.preg-match]: Unknown modifier 'g' in C:\xampp\htdocs\swebook\includes\classes.php on line 22 Can anyone explain what's wrong, and why it's working on that website and not in my code? 回答1: There is no modifier g for preg_match . Instead, you have to use the preg_match_all function. So instead of:

preg_match 与 preg_match_all 函数

匿名 (未验证) 提交于 2019-12-02 23:47:01
正则表达式在 PHP 中的应用 在 PHP 应用中,正则表达式主要用于: 正则匹配:根据正则表达式匹配相应的内容 正则替换:根据正则表达式匹配内容并替换 正则分割:根据正则表达式分割字符串 在 PHP 中有两类正则表达式函数,一类是 Perl 兼容正则表达式函数,一类是 POSIX 扩展正则表达式函数。二者差别不大,而且推荐使用Perl 兼容正则表达式函数,因此下文都是以 Perl 兼容正则表达式函数为例子说明。 定界符 Perl 兼容模式的正则表达式函数,其正则表达式需要写在定界符中。任何不是字母、数字或反斜线()的字符都可以作为定界符,通常我们使用 / 作为定界符。具体使用见下面的例子。 提示 尽管正则表达式功能非常强大,但如果用普通字符串处理函数能完成的,就尽量不要用正则表达式函数,因为正则表达式效率会低得多。关于普通字符串处理函数,请参见《 PHP 字符串处理 》。 preg_match() preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 。 语法: int preg_match( string pattern, string subject [, array matches ] ) 参数说明: 参数 说明 pattern 正则表达式 subject 需要匹配检索的对象 matches 可选,存储匹配结果的数组, $matches[0]

php正则表达式问题

匿名 (未验证) 提交于 2019-12-02 22:11:45
问题: Warning : preg_match(): Unknown modifier ‘/‘ in D:\wwwroot\www.xb.com\t.php on line 6 bool(false) NULL 我的代码: <?php $str = ‘‘; $isMatched = preg_match("/http://www.chinanews.com/gn/2018/07-04/8555660.shtml/", $str, $matches); var_dump($isMatched, $matches); 问题原因: 上述正则的定界符是斜杠’/’, 所以以此往后找,再找一个斜杠’/’,就结束了,得到的是: /http:/ 所以,后面跟着的内容: /www.chinanews.com/gn/2018/07-04/8555660.shtml/ 就没法识别了。 解决办法是: 1. 把定界符,改为别的,和当前正则表达式中的字符,不会冲突的,比如: "#/http://www.chinanews.com/gn/2018/07-04/8555660.shtml#"; 就可以了。 2. 在定界符内的‘/‘前面加上转义字符‘\‘, 如下 "/http:\/\/www.chinanews.com\/gn\/2018\/07-04\/8555660.shtml/" <?php $str =

php preg_match 匹配采集的标签

匿名 (未验证) 提交于 2019-12-02 22:11:45
例子 <img src="http://qiniu.jinfangji.com/uploads/ueditor/php/upload/image/20180529/1527585179779262.png" title="1527585179779262.png" alt="image.png"/> 我要获取src的链接如何匹配 preg_match('/<img src="(.*)" title="(.*)" .*>/i', $uncontent, $arr); (.*)代表取数据 小记: 匹配时每个参数都不能掉了,不然就匹配不出来 自己的坑 preg_match('/<img src="(.*)" title="(.*)" >/i', $uncontent, $arr); 错在哪儿看到没 文章来源: php preg_match 匹配采集的标签

[转]PHP利用PCRE回溯次数限制绕过某些安全限制

♀尐吖头ヾ 提交于 2019-12-02 17:15:48
这次Code-Breaking Puzzles中我出了一道看似很简单的题目 pcrewaf ,将其代码简化如下: <?php function is_php($data){ return preg_match('/<\?.*[(`;?>].*/is', $data); } if(!is_php($input)) { // fwrite($f, $input); ... }  大意是判断一下用户输入的内容有没有PHP代码,如果没有,则写入文件。这种时候,如何绕过 is_php() 函数来写入webshell呢? 这道题看似简单,深究其原理,还是值得写一篇文章的。 0x01 正则表达式是什么 正则表达式是一个可以被“有限状态自动机”接受的语言类。 “有限状态自动机”,其拥有有限数量的状态,每个状态可以迁移到零个或多个状态,输入字串决定执行哪个状态的迁移。 而常见的正则引擎,又被细分为DFA(确定性有限状态自动机)与NFA(非确定性有限状态自动机)。他们匹配输入的过程分别是: DFA: 从起始状态开始,一个字符一个字符地读取输入串,并根据正则来一步步确定至下一个转移状态,直到匹配不上或走完整个输入 NFA:从起始状态开始,一个字符一个字符地读取输入串,并与正则表达式进行匹配,如果匹配不上,则进行回溯,尝试其他状态 由于NFA的执行过程存在回溯,所以其性能会劣于DFA,但它支持更多功能

字符串转数组(php版)

牧云@^-^@ 提交于 2019-12-02 02:15:38
思路: 1.判断当前传来的值是否为数组 2.若不是现将传来的值转换为字符串类型 3.判断当前值是否为空 4.若不为空,采用正则进行匹配,如下图 preg_match('/^{.*?}$/', $string) || preg_match('/^\[.*?]$/', $string) || preg_match('/^a:.*?(})$/', $string) 5.若正则无法匹配,则采用查找首次字符串出现的位置进行拆分分割 strpos($string, $delimiter) >= 1 具体代码示例如下 /** * 字符串、数组转换为格式化的数组 * @param string|array $data 原始字符串,可以为数组、 json字符串、 序列化字符串 * @param string $delimiter 字符串分隔符,默认为英文逗号 * @return array */ function cm_unserialize($data, string $delimiter = ','): array { // 数组原样返回 if (is_array($data)) { return $data; } // 字符串处理 $string = (string)$data; if (empty($string)) { $result = []; } else if (preg_match

php异或计算绕过preg_match()

最后都变了- 提交于 2019-11-30 02:18:58
原理 以制作免杀马为例: 在制作免杀马的过程,根据php的语言特性对字符进行!运算会将字符类型转为bool类型,而bool类型遇到运算符号时,true会自动转为数字1,false会自动转为数字0,如果将bool类型进行计算,并使用chr()函数转为字符,使用"."进行连接,便可以绕过preg_match匹配。 详情了解php不同于其他语言部分 但是很多的preg_match会过滤掉".",所以需要使用异或运算进行绕过,很多的免杀马都是这样制作的。php对字符进行异或运算是先将字符转换成ASCII码然后进行异或运算,并且php能直接对一串字符串进行异或运算,例如"123"^"abc"是"1"与"a"进行异或然后"2"与"b"进行异或,以此类推,在异或结束后就获得了想要的字符串。 注意点:进行异或运算时要将数字转换成字符形式,如果数字(int)和字符异或的话,结果只会是数字,例如1^"a"=1,"a"^2=2,将数字转换成字符串可以使用trim()函数。 拓展: php特性use of undefined constant,会将没有引号的字符都自动视为字符串,ASCII码大于0x7F的都会被当作字符串,由此可知可以简化异或过程,任何字符与0xff异或都会取相反,这样就能减少运算量了。 以GET或POST传入字符绕preg_match为例: php的eval()函数在执行时如果内部有类似