2010-03-31 2 views
1

Я пытаюсь использовать регулярные выражения (preg_match и preg_replace), чтобы сделать следующее:PHP регулярное выражение найти и добавить в строку

Найти строку, как это:

{%title=append me to the title%} 

Затем извлечь из title часть и append me to the title часть. Что я могу затем использовать для выполнения str_replace() и т.д.

Учитывая, что я ужасен в регулярных выражениях, мой код не удается ...

preg_match('/\{\%title\=(\w+.)\%\}/', $string, $matches); 

Какой шаблон мне нужно сделать? :/

ответ

1

Я думаю, это потому, что оператор \w не соответствует пробелам. Поскольку все после знака равенства необходимо вставить перед закрытием %, все это должно совпадать с тем, что находится внутри этих скобок (иначе все выражения не совпадают).

Этот бит кода работает для меня:

$str = '{%title=append me to the title%}'; 
preg_match('/{%title=([\w ]+)%}/', $str, $matches); 
print_r($matches); 

//gives: 
//Array ([0] => {%title=append me to the title%} [1] => append me to the title) 

Обратите внимание, что использование + (один или более) означает, что пустое выражение, то есть. {%title=%} не совпадают. В зависимости от ожидаемого пробела вы можете использовать \s после символьного класса \w вместо фактического символа пробела. \s будет соответствовать вкладки, переводы строк и т.д.

1

Вы можете попробовать:

$str = '{%title=append me to the title%}'; 

// capture the thing between % and = as title 
// and between = and % as the other part. 
if(preg_match('#{%(\w+)\s*=\s*(.*?)%}#',$str,$matches)) { 
    $title = $matches[1]; // extract the title. 
    $append = $matches[2]; // extract the appending part. 
} 

// find these. 
$find = array("/$append/","/$title/"); 

// replace the found things with these. 
$replace = array('IS GOOD','TITLE'); 

// use preg_replace for replacement. 
$str = preg_replace($find,$replace,$str); 
var_dump($str); 

Выход:

string(17) "{%TITLE=IS GOOD%}" 

Примечание:

В своем регулярном выражении: /\{\%title\=(\w+.)\%\}/

  • Там не нужно избегать % как его не метасимвол.
  • Не нужно бежать { и }. Эти мета-символ, но только тогда, когда используется в качестве квантора в виде {min,max} или {,max} или {min,} или {num}. Поэтому в вашем случае они рассматриваются буквально.
+0

Это отлично работает. Cheers – dave

+0

@Gary: Приятно знать, что это работает. Поскольку ответ был полезен для вас, вы можете захотеть поставить вверх. Также, если этот ответ является наиболее полезным из всех ответов, вы можете принять его, проверив правильную метку рядом с ответом. Приветствия :) – codaddict

1

Попробуйте это:

preg_match('/(title)\=(.*?)([%}])/s', $string, $matches); 

матч [1] имеет YOUT название и матч [2] имеет другую часть.

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