2012-03-05 56 views
3

我越来越Syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or '$'

这是我使用

function wpse44503_filter_content($content) { 
    $regex = '#src=("|\')'. 
     '(/images/(19|20)(0-9){2}/(0|1)(0-9)/[^.]+\.(jpg|png|gif|bmp|jpeg))'. 
     '("|\')#'; 
    $replace = 'src="'.get_site_url($2).'"'; 

    $output = preg_replace($regex, $replace, $content); 

    return $output; 
} 

这是我得到的是错误的行代码$replace = 'src="'.get_site_url($2).'"';

任何人都可以帮助我解决它吗? 谢谢

+0

究竟是'$ 2'? – 2012-03-05 18:06:16

+1

$ 2是无效的PHP变量名称....“有效的变量名称以字母或下划线开头,后面跟着任意数量的字母,数字或下划线。” – 2012-03-05 18:06:42

+0

您是否试图将第二个捕获组“$ 2”传递给该函数? (有趣的是,有多少人似乎错过了这个。) – BoltClock 2012-03-05 18:07:59

回答

2

你试图做的事情(即用函数调用的结果替换匹配的字符串)不能使用preg_replace来完成,你需要使用preg_replace_callback来代替每个匹配所需的函数。

preg_replace_callback的简短示例;

$get_site_url =     // Returns replacement 
    function($row) { 
    return '!'.$row[1].'!';  // row[1] is first "backref" 
    };              

$str = 'olle'; 
$regex = '/(ll)/';     // String to match 

$output = preg_replace_callback( // Match, calling get_site_url for replacement 
    $regex, 
    $get_site_url, 
    $str); 

var_dump($output);     // output "o!ll!e" 
+0

那么'T_LNUMBER'究竟意味着什么? – Pacerier 2015-06-29 08:27:27

+0

@Pacerier'T_LNUMBER'表示一个整数(参见[这里](http://www.php.net/tokens)列表)。解析器希望找到一个有效的变量名或另一个'$',但找到整数'2'。原因是'$ 2'是一个非法的变量名,所以解析器将显示这个消息,这基本上意味着“发现了意外的整数”。 – 2015-06-29 09:50:15

+0

所有内容都以'T_'开头,“T”是指“标记”? – Pacerier 2015-07-02 10:37:12

7

您不能有'​​$ 2'作为变量名称。它必须以字母或下划线开头。

http://php.net/manual/en/language.variables.basics.php

变量名遵循相同的规则,如PHP等标签。有效的变量名称以字母或下划线开头,后跟任意数量的字母,数字或下划线。为正则表达式,这将被表述为: '[A-ZA-Z_ \ x7f- \ XFF] [A-ZA-Z0-9_ \ x7f- \ XFF] *'

编辑以上是我的原始答案,是简单的“语法错误”问题的正确答案。下面更深入的答案...

你试图用$ 2来表示“第二个捕获组”,但你没有做任何事情来匹配你的正则表达式。即使$ 2是一个有效的PHP变量名,它仍然不会在您的脚本中设置。因此,您可以确定您使用preg_replace的方式不正确,并且可能不符合您的实际需要。

请注意,preg_replace文档不支持使用$ n作为替换操作之外的单独变量。换句话说,'foo' . $1 . 'bar'不是有效的替换字符串,但是'foo$1bar'是。

根据的get_site_url复杂,你有两个选择:

  1. 如果get_site_url是简单地增加一个根目录或服务器名称,则可以将替换字符串更改为src="/myotherlocation$2"。这将在img src中用“/ myotherlocation/image/...”有效地替换“/ image/...”。如果get_site_url正在做更复杂的事情,这将不起作用。

  2. 如果get_site_url很复杂,则应该使用preg_replace_callbackother answers。如果您在实施过程中遇到问题,请给文档一个阅读并发布一个新问题(或者我想更新这个问题?)。

2

$2不是有效的PHP变量。如果你的意思是正则表达式中的第二组,那么你想把\2放在一个字符串中。但是,由于您将它传递给函数,因此您需要使用preg_replace_callback(),并在回调中进行适当的替换。

+0

我试图将第二个捕获组传递给该函数。如何把'\ 2'。如果你不介意给我一些示例代码,或者你能给我我函数的修改代码吗?谢谢 – user1091558 2012-03-05 18:14:26

+2

你是否甚至不知道阅读提供的链接? – 2012-03-05 18:16:04

+0

嘿,对不起,你误会了我。我是一名PHP初学者。我检查了你提供的链接。但它看起来更先进。这就是为什么我还在问你的帮助。 – user1091558 2012-03-05 18:19:22

相关问题