0

我正在尝试构建一个正则表达式,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这项工作?

4

2 回答 2

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 解决方法。

编辑:是的,不行。我会推荐 preg_replace_callback 。

于 2012-12-29T22:47:21.640 回答
0

我最终解决了以下问题:

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

我需要这作为多步骤操作的一个步骤,所以我想使用这个正则表达式来烘焙一个可以一次性完成所有事情的超级正则表达式。然而,事实证明preg_replace也可以输入“搜索”和“替换”数组,因此我将其作为最终解决方案。这种方式也更容易掌握。

干杯。

于 2012-12-30T12:43:10.833 回答