preg_replace_callback正则表达式问题,与(。*?)匹配返回数组

时间:2013-09-25 06:11:28

标签: php regex

给定字符串{{esc}}"Content"{{/esc}} ... {{esc}}"More content"{{/esc}}我想输出\"Content\" ... \"More content\",例如,我试图转义字符串中的引号。 (这是一个人为的例子,所以回答“只是使用这个库来实现它”将是无益的。)

这是我目前的解决方案:

return preg_replace_callback(
  '/{{esc}}(.*?){{\/esc}}/', 
  function($m) {
    return str_replace('"', '\\"', $m[1]);
  },
  $text
);

正如您所看到的,我需要说$m[1],因为print_r显示$m看起来像这样:

Array 
(
    [0] => {{esc}}"Content"{{/esc}}
    [1] => "Content"
)

或者,对于第二场比赛,

Array 
(
    [0] => {{esc}}"More content"{{/esc}}
    [1] => "More content"
)

我的问题是:为什么我的正则表达式导致$m成为一个数组?我有什么方法可以将$m[1]的结果只作为一个变量{ {1}}?

2 个答案:

答案 0 :(得分:0)

正则表达式匹配字符串并将结果放入数组。如果匹配,则第一个索引存储整个匹配字符串,数组的其余元素是捕获的字符串。

preg_replace_callback()的行为类似于preg_match()

 $result = array();
 preg_match('/{{esc}}(.*?){{\/esc}}/', $input_str, $result);

 // $result will be an array if match.

答案 1 :(得分:0)

在Jack的帮助下,我在这里回答了我自己的问题,因为srain没有明确指出这一点:数组的第二个元素是括号内的子表达式(.*?)按照PHP manual.捕获的结果实际上,似乎没有一种方便的方法来提取与此子表达式匹配的字符串。