2014-11-14 2 views
0

Я пытаюсь добавить свои собственные теги в контент сайта, чтобы пользователь мог добавить указанный тег, и он заменяет соответствующий контент. например [company_address]Создание собственных тегов с заменой preg

Я использую preg_replace ($ patterns, $ replacements, $ content);

но он заполняет страницу скремблированным текстом.

function search4Tags($content){ 

    $patterns = array(); 
    $patterns[0] = '/[company_name]/'; 
    $patterns[1] = '/[company_logo]/'; 
    $patterns[2] = '/[company_address]/'; 

    $replacements = array(); 
    $replacements[0] = $_SESSION['company_name']; 
    $replacements[1] = $_SESSION['company_logo']; 
    $replacements[2] = $_SESSION['company_address']; 

    return preg_replace($patterns, $replacements, $content); 
} 
+1

Вы не избежали '[' и ']' в своем регулярном выражении. Кроме того, вы можете использовать ['str_replace'] (http://php.net/str_replace). –

ответ

1

Проблема заключается в квадратных скобках. Они определяют группу символов: любой символ внутри будет соответствовать.

Например, /[company_name]/ соответствует любому из символов acemnopy_, поэтому любое их возникновение будет заменено.

От str_replace() документы:

Если вам не нужны фантазии замены правила (как регулярные выражения), вы всегда должны использовать эту функцию вместо preg_replace().

Поскольку вы только заменяете постоянные строки, я бы порекомендовал вместо этого str_replace(). Это предполагает, что шаблоны поиска - это простые строки.

Просто замените preg_replace() на str_replace() и снимите слэши регулярного выражения.

$patterns = array(); 
$patterns[0] = '[company_name]'; 
$patterns[1] = '[company_logo]'; 
$patterns[2] = '[company_address]'; 
// identical code omitted 
return str_replace($patterns, $replacements, $content); 

Если вы действительно, действительно нужно использовать preg_replace(), избежать скобки с \ «с.

$patterns = array(); 
$patterns[0] = '/\\[company_name\\]/'; 
$patterns[1] = '/\\[company_logo\\]/'; 
$patterns[2] = '/\\[company_address\\]/'; 
// identical code omitted 
+0

Thanks Pietu1998 – ajl80

1

Как уже упоминалось выше, для этого не требуется preg_replace. str_replace() сделает все, что вам нужно, и многое другое. И ровно в 1 строке меньше.

E.G.

$this->body = str_replace('[company_name]', '$_SESSION[company_name]', $this->body); 
+0

У вас есть дополнительные одинарные кавычки. – Pietu1998

+0

Я изначально отправил контент из БД в функцию, чтобы $ this-> искать тело на всей странице, а не просто возвращать пересмотренный контент. – ajl80

+0

@ Pietu1998, действительно, я приветствую, указывая на это. Ajl80 - вы можете сделать это, как вам угодно, это просто пример, показывающий, что str_replace более уместен для вас. – iamgory

Смежные вопросы