Синтаксическая ошибка, неожиданный T_LNUMBER, ожидаемый T_VARIABLE или '$'

Я собираюсь 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 ).'"';

Может кто-нибудь помочь мне это исправить? Спасибо

5 ответов

Решение

То, что вы пытаетесь сделать (т.е. заменить совпавшую строку на результат вызова функции), не может быть сделано с помощью 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"

Вы не можете иметь $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, у вас есть 2 варианта:

  1. Если get_site_url просто добавление корневого каталога или имени сервера, вы можете изменить строку замены на src="/myotherlocation$2", Это эффективно заменит "/image/..." на "/myotherlocation/image/..." в img src. Это не будет работать, если get_site_url делает что-то более сложное.

  2. Если get_site_url сложно, вы должны использовать preg_replace_callback за другие ответы. Прочтите документацию и отправьте новый вопрос (или, я полагаю, обновите этот вопрос?), Если у вас есть проблемы с реализацией.

$2 не является допустимой переменной PHP. Если вы имели в виду вторую группу в регулярном выражении, то вы хотите поставить \2 в строке. Однако, так как вы передаете его функции, вам необходимо использовать preg_replace_callback() вместо этого и заменить соответствующим образом в обратном вызове.

Имена переменных PHP не могут начинаться с цифры.

Если переменная PHP начинается с числа, используйте следующее:

когда я получал следующее в качестве набора результатов от стороннего API

Код работает

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

Код не выполнен

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

Решение

$stockInfo->original->data[0]->{'52_week_high'}
Другие вопросы по тегам