正则表达式为不带引号的表达式添加引号

时间:2012-12-29 22:41:20

标签: php regex pcre

我正在尝试构建一个正则表达式,如果它没有引用,将使用preg_replace来引用表达式的右侧。

因此myvar = 3变为myvar = '3'。它应该只处理连续的不带引号的字符串(因此,如果需要引用第一个字符串上的任何空格,例如myvar = 3 5将成为myvar = '3' 5)。

我还希望它忽略任何带引号的字符串,因此不应修改myvar = 'this is quoted'

到目前为止,我有以下代码:

$str = 'myvar = 3';
$regex = '/([\w\@\-]+) *(\=|\>|\>\=|\<|\<\=) *([\w]+)/i';
$replace = '\1 \2 \'\3\'';
$result = preg_replace($regex, $replace_str, $str);

我需要在$regex中放入什么才能使其发挥作用?

2 个答案:

答案 0 :(得分:0)

您可以使用preg_replace_callback,或者这可能有效(仅限正则表达式的右侧):

#([^\'\"])(\w+)([^\'\"])#

并替换为:

$exp = '#([^\'\"])(\w+)([^\'\"])#';
$str = 'This is unquoted';
$quoted = preg_replace($exp, '\'$1$2$3\'', $str); // should hopefully be 'This is unquoted' after. Not tested.

虽然这是一种hacky work-around。

编辑: 是的,不行。我建议使用preg_replace_callback。

答案 1 :(得分:0)

我最终解决了以下问题:

$str = 'myvar = 3';
$regex = '/([\w\@\-]+) *(\=|\>|\>\=|\<|\<\=) *([^\s\']+)/i';
$replace = '\1 \2 \'\3\'';
$result = preg_replace($regex, $replace_str, $str);

我需要这个作为多步操作的一步,所以我想用这个正则表达式来烘焙一个可以一次完成所有事情的超级正则表达式。然而,事实证明preg_replace也可以被'搜索'和'替换'数组,所以我选择了它作为我的最终解决方案。掌握这种方式也更容易。

干杯。