我正面临着正则表达式的问题。
我有一个像('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')
。
答案 0 :(得分:1)
答案 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_callback
:
http://php.net/manual/fr/function.preg-replace-callback.php