【高手请入】preg_replace()的回调,第二个参数为何要字符串嵌套?! 本帖最后由 xuzuning 于 2011-12-24 08:45:02 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 $p = new autoAddHttp;echo $p;输出<a href="http://www.163.com">http://www.163.com</a> 难道你觉得我是url么?<a href="http://www.133.com">www.133.com</a><a href="http://www.152.com">www.152.com</a><a href="http://www.jp0576.com">www.jp0576.com</a><a href="http://test.test.com">test.test.com</a><br> replacement 可以包含 //n 形式或(自 PHP 4.0.4 起)$n 形式的逆向引用,首选使用后者。每个此种引用将被替换为与第 n 个被捕获的括号内的子模式所匹配的文本。n 可以从 0 到 99,其中 //0 或 $0 指的是被整个模式所匹配的文本。对左圆括号从左到右计数(从 1 开始)以取得子模式的数目。对替换模式在一个逆向引用后面紧接着一个数字时(即:紧接在一个匹配的模式后面的数字),不能使用熟悉的 //1 符号来表示逆向引用。 两位大佬 谢谢光顾不过您2位都没有回答重点啊请赐教:为何第二个参数要写成:'"<htmlcode."'.'">"'而不能写成:'htmlcode1'.'htmlcode2'在vi下看的清楚嵌套关系 下图:http://hi.csdn.net/attachment/201112/24/10245627_1324686965Rs2d.jpg 我都用了模式控制符e了,基本的我是懂的。preg_replace()第二个参数本来是传字符串 放单引号里面,用点做连接符然后单引号里面非要再模拟字符串 也就是单引号里面要用双引号双,引号这层还要用点做连接符再连接起来,用vi可以看清嵌套 http://hi.csdn.net/attachment/201112/24/10245627_1324686965Rs2d.jpg 我的目的就是回调addHttp函数返回字符串:http://然后前后加上其他html代码,这些代码非要放到双引号里面 '"<a href=\""'.'.$this->addHttp("\1").'.'"\1\2.\3.\4\">".'.'"\1\2.\3.\4</a>"'移去累赘的 '.',并脱去外层的引号"<a href=\"" . $this->addHttp("\1") . "\1\2.\3.\4\">" . "\1\2.\3.\4</a>"正好符合 /e 要求:一个字符串表达式 '"<a href=\""'.'.$this->addHttp("\1").'.'"\1\2.\3.\4\">".'.'"\1\2.\3.\4</a>"'以上就是我第二个参数,不是回调问题,而是preg_repalce的参数问题注意观察 单引号 和双引号的嵌套,这也太奇怪了吧按理说下成如下 可是不行'<a href=\"'.'$this->addHttp("\1")'.'\1\2.\3.\4\">'.'\1\2.\3.\4</a>' 难道/e会脱1层引号??所以用下面这样的 不行?'<a href=\"'.'$this->addHttp("\1")'.'\1\2.\3.\4\">'.'\1\2.\3.\4</a>' 如果要符合/e的要求:一个字符串'<a href=\"'.'$this->addHttp("\1")'.'\1\2.\3.\4\">'.'\1\2.\3.\4</a>'这不就是个字符串么?为何不成呢???????请赐教~ 你可以这么理解 ( "/e会脱1层引号" )但实际上,引号内的字符串必须是一段可以被php处理的代码....这样讲是不是不够清楚,换句话说, 它和 eval的参数,create_function的第二个参数有类似的地方 (不完全相同,因为preg_replace这个不需要echo或print等,它只是一个表达式) 钻牛角尖里去了e就是eval,先preg_replace,再执行eval,所以替换后字符串要符合php的语法规范,否则就会解析通不过,Parse error例如:'"<a href=\"{$this->addHttp("\1")}\1\2.\3.\4\">\1\2.\3.\4</a>"'这样也没问题 如何这样布局数据 为什么输入中文时没有起效?? 一个关于while的问题 PHP的开发工具? 200分请教strace发现的一个问题 好奇怪,一个php搜索的问题. MYsql总是出以下的错,当我更新一个记录时: PHP能否检查是否有任何输出? 怎样判断用户是否已经登录? MYSQL密码设置问题?神啊!救救我吧(大分享送) php如何获取title了 请问在mysql中添加数据,如何能够做到拒绝添加重复的数据
echo $p;输出<a href="http://www.163.com">http://www.163.com</a> 难道你觉得我是url么?
<a href="http://www.133.com">www.133.com</a>
<a href="http://www.152.com">www.152.com</a>
<a href="http://www.jp0576.com">www.jp0576.com</a>
<a href="http://test.test.com">test.test.com</a>
<br>
不过您2位都没有回答重点啊
请赐教:
为何第二个参数要写成:'"<htmlcode."'.'">"'
而不能写成:'htmlcode1'.'htmlcode2'在vi下看的清楚嵌套关系 下图:
http://hi.csdn.net/attachment/201112/24/10245627_1324686965Rs2d.jpg
preg_replace()第二个参数本来是传字符串 放单引号里面,用点做连接符
然后单引号里面非要再模拟字符串 也就是单引号里面要用双引号双,引号这层还要用点做连接符再连接起来,用vi可以看清嵌套
http://hi.csdn.net/attachment/201112/24/10245627_1324686965Rs2d.jpg
然后前后加上其他html代码,这些代码非要放到双引号里面
移去累赘的 '.',并脱去外层的引号
"<a href=\"" . $this->addHttp("\1") . "\1\2.\3.\4\">" . "\1\2.\3.\4</a>"正好符合 /e 要求:一个字符串表达式
注意观察 单引号 和双引号的嵌套,这也太奇怪了吧
按理说下成如下 可是不行
'<a href=\"'.'$this->addHttp("\1")'.'\1\2.\3.\4\">'.'\1\2.\3.\4</a>'
所以用下面这样的 不行?
'<a href=\"'.'$this->addHttp("\1")'.'\1\2.\3.\4\">'.'\1\2.\3.\4</a>'
'<a href=\"'.'$this->addHttp("\1")'.'\1\2.\3.\4\">'.'\1\2.\3.\4</a>'
这不就是个字符串么?
为何不成呢???????
请赐教~
你可以这么理解 ( "/e会脱1层引号" )但实际上,引号内的字符串必须是一段可以被php处理的代码....这样讲是不是不够清楚,换句话说, 它和 eval的参数,create_function的第二个参数有类似的地方
(不完全相同,因为preg_replace这个不需要echo或print等,它只是一个表达式)
钻牛角尖里去了
e就是eval,先preg_replace,再执行eval,所以替换后字符串要符合php的语法规范,否则就会解析通不过,Parse error例如:'"<a href=\"{$this->addHttp("\1")}\1\2.\3.\4\">\1\2.\3.\4</a>"'这样也没问题