PHP регулярное выражение найти и добавить в строку - PullRequest
1 голос
/ 31 марта 2010

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

Найдите строку, подобную этой:

{%title=append me to the title%}

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

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

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

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

Ответы [ 3 ]

1 голос
/ 31 марта 2010

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

$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}. Так что в вашем случае они трактуются буквально.
1 голос
/ 31 марта 2010

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

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

Совпадение [1] имеет ваш заголовок, а совпадение [2] - другую часть.

1 голос
/ 31 марта 2010

Я думаю, это потому, что оператор \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 будет соответствовать вкладкам, переводам строки и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...