正则表达式在匹配字符串的开头和结尾用单引号替换double

时间:2015-03-12 19:01:25

标签: php regex

我需要在定义的字符串后面为完整的行设置单引号。

cite: Lorem ipsum dolor

应该

cite: 'Lorem ipsum dolor'

因此,我正在使用此正则表达式:

$line = preg_replace('/cite:\s*\K(.*)?$/s', '\'$1\'', $line);

但是我需要一些额外的东西:如果该行已经有双引号 - 这意味着在开始和结束时(可选加一些空格) - 它应该用单引号替换。如果双引号位于中间位置,则不会发生任何事情。

如果在行的开头或结尾已经有单引号,则不应该对该行进行任何操作。

行中间的单引号需要转义。正如在YAML文件中使用的那样,字符串中间的单引号必须通过将单引号加倍来进行转义('应该得到'')。

示例:

cite: "Lorem ipsum dolor"
cite: Lorem ipsum "dolor"
cite: Lorem "ipsum" dolor
cite: "Lorem "ipsum" dolor"
cite: 'Lorem ipsum dolor'
cite: Lorem 'ipsum' dolor

应该产生以下结果:

cite: 'Lorem ipsum dolor'
cite: 'Lorem ipsum "dolor"'
cite: 'Lorem "ipsum" dolor'
cite: 'Lorem "ipsum" dolor'
cite: 'Lorem ipsum dolor'
cite: 'Lorem ''ipsum'' dolor'

1 个答案:

答案 0 :(得分:4)

您可以使用:

$line = preg_replace_callback('/cite:\s*\K([\'"]?)(.+?)\1\h*$/m', function($m) {
            return "'" . str_replace("'", "''", $m[2]) . "'"; }, $line);

RegEx Demo