给定字符串{{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}}?
答案 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.捕获的结果实际上,似乎没有一种方便的方法来提取与此子表达式匹配的字符串。