使用正则表达式替换前面带有单词的括号,前面没有单词

时间:2014-08-16 18:36:31

标签: php regex

我正面临着正则表达式的问题。

我有一个像('A'&'B')

这样的字符串

现在我想将它转换为CONCAT('A'&'B'),这很简单,我已经使用

str_replace("(", "CONCAT(", $subject)

但如果字符串没有先前的字符串"(",我想将"CONCAT("替换为"extract_json_value"

所以我不想将extract_json_value('A'&'B')替换为extract_json_valueCONCAT('A'&'B'),但它会保持原样extract_json_value('A'&'B')

3 个答案:

答案 0 :(得分:1)

您可以使用负面的背后扩展正则表达式:

(?<!extract_json_value)\(

这是regex demo

答案 1 :(得分:1)

您可以使用strpos来执行此操作。

if (strpos($subject, '(') === 0) {
  $subject = str_replace('(', 'CONCAT(', $subject);
}

如果您的字符串包含其他文字,则可以使用preg_replace()并使用字边界\B

$subject = preg_replace('/\B\(/', 'CONCAT(', $subject);

答案 2 :(得分:1)

您可以使用负向lookbehind以匹配不以字符串开头的组。

首先,让我们有一个匹配所有字符串的正则表达式,但包含“extract_json_value”的字符串:

(?<!extract_json_value).*

现在,让我们使用preg_replace

$string = "extract_json_value('A'&'B')";
$pattern = '/^(?<!extract_json_value)(\(.+\))$/';
$replacement = 'CONCAT\1';
echo preg_replace($pattern, $replacement, $string);
// prints out "extract_json_value('A'&'B')"

它也适用于

$string = "('A'&'B')";
...
// prints out "CONCAT('A'&'B')"

但是,它不适用于

$string = "hello('A'&'B')";
...
// prints out "helloCONCAT('A'&'B')"

所以,继续preg_replace_callbackhttp://php.net/manual/fr/function.preg-replace-callback.php