preg_replace не работает

artefakt777

Постоялец
Регистрация
15 Июл 2012
Сообщения
532
Реакции
140
Приветствую! Перешел на php7, возникла ошибка:
Warning: preg_replace_callback(:( Requires argument 2, '$this->insertgold()', to be a valid callback in

Ошибка в этом месте:
public function onContentPrepare($context, &$row, &$params, $page = 0) {
$row->text = preg_replace_callback('|{gold}|e', '$this->insertgold()', $row->text);
return true;
}

Подскажите, как корректно переписать. Спасибо.
 
Вот здесь не нужны кавычки
Для просмотра ссылки Войди или Зарегистрируйся

PHP:
public function onContentPrepare($context, &$row, &$params, $page = 0) {
$row->text = preg_replace_callback('|{gold}|e', $this->insertgold(), $row->text);
return true;
}
 
Вот здесь не нужны кавычки
Для просмотра ссылки Войди или Зарегистрируйся

PHP:
public function onContentPrepare($context, &$row, &$params, $page = 0) {
$row->text = preg_replace_callback('|{gold}|e', $this->insertgold(), $row->text);
return true;
}
Спасибо за ответ, но теперь вываливается ошибка:
Call to undefined function file_get_html()

Выложу весь код для наглядности:
PHP:
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport( 'joomla.plugin.plugin' );
class plgContentjlife_gold extends JPlugin
{
   
    public function onContentPrepare($context, &$row, &$params, $page = 0) {
        $row->text = preg_replace('|{gold}|e', '$this->insertgold()', $row->text);
        return true;
    }
   
    function insertgold(){
        require_once 'simple_html_dom.php';
        $html = file_get_html('http://www.profinance.ru/chart/gold/');
       
        // Золото
        foreach($html->find('.stat tr[2] td[1]') as $a){
            $gold = str_replace(",",".",$a->plaintext);
        }
       
        // Тенге
        $html2 = file_get_html('http://www.nationalbank.kz/?&switch=russian');
        $k = $html2->find('.gen14_1',3);
        $k2 = $k->find('tr',0);   
        $kurs = $k2->find('td',1)->plaintext;
   
       
        // Курсы
        $gold_999 = round((($gold/31.1) * $kurs)*0.88,0);
        $gold_375 = round(($gold_999/100)*37.5,0);
        $gold_585 = round(($gold_999/100)*58.5,0);
        $gold_750 = round(($gold_999/100)*75,0);
        $gold_850 = round(($gold_999/100)*85,0);
        $gold_900 = round(($gold_999/100)*90,0);
        $gold_916 = round(($gold_999/100)*91.6,0);
       
       
   
       
        return $text;
    }
}
 
Спасибо за ответ, но теперь вываливается ошибка:
Call to undefined function file_get_html()

Выложу весь код для наглядности:
PHP:
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport( 'joomla.plugin.plugin' );
class plgContentjlife_gold extends JPlugin
{
  
    public function onContentPrepare($context, &$row, &$params, $page = 0) {
        $row->text = preg_replace('|{gold}|e', '$this->insertgold()', $row->text);
        return true;
    }
  
    function insertgold(){
        require_once 'simple_html_dom.php';
        $html = file_get_html('http://www.profinance.ru/chart/gold/');
      
        // Золото
        foreach($html->find('.stat tr[2] td[1]') as $a){
            $gold = str_replace(",",".",$a->plaintext);
        }
      
        // Тенге
        $html2 = file_get_html('http://www.nationalbank.kz/?&switch=russian');
        $k = $html2->find('.gen14_1',3);
        $k2 = $k->find('tr',0);  
        $kurs = $k2->find('td',1)->plaintext;
  
      
        // Курсы
        $gold_999 = round((($gold/31.1) * $kurs)*0.88,0);
        $gold_375 = round(($gold_999/100)*37.5,0);
        $gold_585 = round(($gold_999/100)*58.5,0);
        $gold_750 = round(($gold_999/100)*75,0);
        $gold_850 = round(($gold_999/100)*85,0);
        $gold_900 = round(($gold_999/100)*90,0);
        $gold_916 = round(($gold_999/100)*91.6,0);
      
      
  
      
        return $text;
    }
}
Эта функция объявлена в simple_html_dom.php файле? Возможно где-то условие перестало срабатывать либо какой-то файл не подключается

Не знаю что за функция, документации по ней не нашел, но тут есть ответ Для просмотра ссылки Войди или Зарегистрируйся

Я бы тоже рекомендовал перейти на phpQuery
 
Для использования функции file_get_html() требуется обязательно подключать библиотеку simple_html_dom.php
PHP:
require_once('simple_html_dom.php');
У Вас есть запрос на ее подключение, но проверьте, правильно ли указан путь до нее. Ваш код будет работать, только если файл с simple_html_dom.php лежит в той же папке, что и файл с приведенным выше PHP-кодом. Возможно, 12-я строка в Вашем коде должна выглядеть так:
Для использования функции file_get_html() требуется обязательно подключать библиотеку simple_html_dom.php
PHP:
require_once('/путь_до_simple_html_dom/simple_html_dom.php');
 
Для использования функции file_get_html() требуется обязательно подключать библиотеку simple_html_dom.php
PHP:
require_once('simple_html_dom.php');
У Вас есть запрос на ее подключение, но проверьте, правильно ли указан путь до нее. Ваш код будет работать, только если файл с simple_html_dom.php лежит в той же папке, что и файл с приведенным выше PHP-кодом. Возможно, 12-я строка в Вашем коде должна выглядеть так:
Для использования функции file_get_html() требуется обязательно подключать библиотеку simple_html_dom.php
PHP:
require_once('/путь_до_simple_html_dom/simple_html_dom.php');

Да, библиотека подключена, более того весь код выше работает на php 5.6. При переходе на php7 выходит ошибка:
Warning: preg_replace(:( The /e modifier is no longer supported, use preg_replace_callback instead in
в этой строке:
PHP:
    $row->text = preg_replace('|{gold}|e', '$this->insertgold()', $row->text);

Если меняем так:
PHP:
    $row->text = preg_replace_callback('|{gold}|e', '$this->insertgold()', $row->text);
То получаем следующую ошибку:
Warning: preg_replace_callback(:( Requires argument 2, '$this->insertgold()', to be a valid callback in
 
Да, библиотека подключена, более того весь код выше работает на php 5.6. При переходе на php7 выходит ошибка:
Warning: preg_replace:)( The /e modifier is no longer supported, use preg_replace_callback instead in
в этой строке:
PHP:
    $row->text = preg_replace('|{gold}|e', '$this->insertgold()', $row->text);

Если меняем так:
PHP:
    $row->text = preg_replace_callback('|{gold}|e', '$this->insertgold()', $row->text);
То получаем следующую ошибку:
Warning: preg_replace_callback:)( Requires argument 2, '$this->insertgold()', to be a valid callback in

Еще раз повторюсь, вокруг $this->insertgold() не должно быть кавычек. Вот как строка должна выглядеть

PHP:
    $row->text = preg_replace('|{gold}|e', $this->insertgold(), $row->text);
 
В callback-функции метод созданного объекта передается как массив, содержащий объект по индексу 0 и имя метода по индексу 1.
array($obj, 'myCallbackMethod')
Для просмотра ссылки Войди или Зарегистрируйся
PHP:
$row->text = preg_replace_callback('|{gold}|', [$this, 'insertgold'], $row->text);
 
В callback-функции метод созданного объекта передается как массив, содержащий объект по индексу 0 и имя метода по индексу 1.
array($obj, 'myCallbackMethod')
Для просмотра ссылки Войди или Зарегистрируйся
PHP:
$row->text = preg_replace_callback('|{gold}|', [$this, 'insertgold'], $row->text);
При замене на такую конструкцию выходит ошибка:
Call to a member function find() on boolean
 
Назад
Сверху