传递正则表达式匹配到函数时出错。

4

我遇到了一个错误: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 ).'"';

有没有人能帮我修复它呢? 谢谢。


1
$2 是一个无效的 PHP 变量名... "有效的变量名应该以字母或下划线开头,后面可以跟任意数量的字母、数字或下划线。" - Mark Baker
你是想将第二个捕获组 $2 传递给那个函数吗?(有趣的是有多少人似乎忽略了这一点。) - BoltClock
@BoltClock 是的,没错。我正在尝试将第二个捕获组传递到该函数中。我应该在那里放什么,而不是 $2?谢谢。 - Giri
什么是捕获组?在 $replace = 'src="'.get_site_url( $2 ).'"'; 行之前(就我所见的代码中),您还没有执行正则表达式匹配。 - user554546
@user1091558,我在下面的答案中添加了preg_replace_callback的示例,你需要使用该函数才能调用匹配项上的函数。 - Joachim Isaksson
5个回答

9
您不能将“$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_callback,如其他答案所述。请阅读文档,并在实施方面遇到问题时发布一个新问题(或者更新此问题?)。


4
你想要做的事情(即用函数调用的结果替换匹配的字符串)不能使用 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"

1
那么 T_LNUMBER 究竟是什么意思? - Pacerier
@Pacerier T_LNUMBER 意思是整数(可在此处查看完整列表)。解析器期望找到一个有效的变量名或另一个 $,但却发现了整数 2。原因是 $2 是不合法的变量名,所以解析器会显示这条消息,基本意思是“找到了意外的整数”。 - Joachim Isaksson
所有的东西都以 T_ 开头,这里的 "T" 是指 "token" 吗? - Pacerier

3

PHP变量名不能以数字开头。


3

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


我正在尝试将第二个捕获组传递给那个函数。如何使用\2来表示它。如果你不介意的话,能否给我一些示例代码或者修改我的函数代码?谢谢 - Giri
嘿,抱歉...你搞错了,我是PHP初学者。我已经检查了你提供的链接,但它看起来更高级,这就是为什么我仍然寻求你的帮助的原因。 - Giri

0

如果 PHP 变量以数字开头,请使用以下内容:

当我从第三方 API 获取以下结果集时:

enter image description here

代码运行正常

$stockInfo->original->data[0]->close_yesterday

代码失败

$stockInfo->original->data[0]->52_week_low

解决方案

$stockInfo->original->data[0]->{'52_week_high'}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接