PHP preg_replace-在结果中包含模式/完整主题

PHP preg_replace-在结果中包含模式/完整主题,php,regex,preg-replace,Php,Regex,Preg Replace,我有一个我自己无法解决的问题:替换 locale("Sendx", "Send") locale("System", "System") 应该变成: 我尝试了一个简单的替换: $mysearchword = "System"; #changes in a loop $myreplaceword = "Newsys"; #also changes in the loop $oneline = str_replace($mysearchword, $myreplaceword, $oneline)

我有一个我自己无法解决的问题:替换

locale("Sendx", "Send")
locale("System", "System")
应该变成:

我尝试了一个简单的替换:

$mysearchword = "System"; #changes in a loop
$myreplaceword = "Newsys"; #also changes in the loop
$oneline = str_replace($mysearchword, $myreplaceword, $oneline);
但结果看起来

locale("Sendx", "53ND")
locale("Newsys", "Newsys") #problem with the doubled word
当然,这两次都更换了系统。所以我决定使用preg\u replace

$pattern = '/locale\\(["|\']([^"\']*)["|\'], ["|\']([^"\']*)["|\']\\)/';
$replacement = '${1}, Newsys';
$subject = 'locale("System", "System")';
echo preg_replace($pattern, $replacement, $subject, -1 );
但现在几乎什么都没有了,因为只返回括号中的单词,我不知道如何包含模式或返回替换的$subject。 $pattern发生了变化,所以我无法将“locale(…”写入$replacement/I,我必须返回一个被替换的模式

System, Newsys # No idea how to combine $replacement with $pattern...

你能帮我得到正确的结果吗?

我想你在寻找这样的东西:

$input  = 'locale("Sendx", "Send")';
$output = preg_replace('/, "(.*?)"/', ', "Subsub"', $input);
echo $output;
echo "\n";

$input  = 'locale("System", "System")';
$output = preg_replace('/, "(.*?)"/', ', "Newsys"', $input);
echo $output;
输出:

locale("Sendx", "Subsub")
locale("System", "Newsys")
模式
/,“(.*?”/
在逗号后双引号之间搜索单词
,并将其替换为
,“新单词”

使用此模式,您可以轻松地在循环中替换它们:

$input = array(
  'locale("Sendx", "Send")' => 'Subsub',  
  'locale("System", "System")' => 'Newsys'
);

foreach($input as $string => $replacement) {
    $output = preg_replace('/, "(.*?)"/', ', "' . $replacement . '"', $string);
    echo $output. PHP_EOL;
}

这实际上取决于此输入的格式有多好,但与此类似的内容将适用于您的示例:

(locale\("[^"]*",\s*")System("\))

在PHP中:

$find = 'System';
$replace = 'Newsys';

$pattern = '/(locale\("[^"]*",\s*")'.$find.'("\))/';
$replacement = '$1'.$replace.'$2';
$subject = 'locale("System", "System")';
echo preg_replace($pattern, $replacement, $subject); 
//Outputs: locale("System", "Newsys")

更换需要多复杂?这将在该特定示例中起作用:

$str = '
locale("Sendx", "Send")
locale("System", "System")';

$str =
str_replace('"System", "System"', '"System", "Newsys"',
str_replace('"Send"', '"Subsub"', $str));

echo "<pre>$str</pre>";
$str='1〕
区域设置(“Sendx”、“Send”)
地区(“系统”、“系统”);
$str=
str_replace('系统','系统','系统','新闻系统',
str_替换('Send'、'subsubsub'、$str));
回声“$str”;

可能只需要替换第二个变量。
每次你想更换某件东西时,都要更换一个新的preg\u 此正则表达式使用分支重置来解析引号


在对最后一部分执行正则表达式之前,您不应该害怕拆分字符串。这可能会使拆分更容易,并产生更可读的代码:)预期的结果是什么?这是什么?为什么你要把一个简单的问题复杂化?坚如磐石的解决方案,我敢说是牢不可破的..?@OGHaza-谢谢!这有点不舒服。如果更多地了解真实的形式,很多东西可能会被删减。@sln嘿!你真的是一个人!:)我必须承认,我以为你的答案是机器给出的!对不起..你怎么办你是说常数?你把一个常数输入字符串连接到一个替换字符串,但是正则表达式对变量数据不起作用。它对一个固定替换的常数起作用。是的,但这是问题的要求。否则可能会使用
preg\u quote
。不是吗?在主题字符串上,它实际上只是查找:
locale(“Sendx”、“Send”)
,替换:
locale(“Sendx”、“Subsub”)
。与
“System”
=>“Newsys”相同,但查找是正则表达式的一部分。正则表达式不能固定为
”(.*?)
。我的意思是,如果它是回调,则会根据“Send”或“System>检查匹配“并适当地更换,这可能是我的做法。我认为他没有提到这一点。OP说他有要转换成其他文本的文本。总共2行。是的,这就是我的观点。
$str = '
locale("Sendx", "Send")
locale("System", "System")';

$str =
str_replace('"System", "System"', '"System", "Newsys"',
str_replace('"Send"', '"Subsub"', $str));

echo "<pre>$str</pre>";
 # FIND: 
 # $pattern =
 # '/(?s)(?|(locale\s*\(\s*"[^"\\\]*(?:\\\.[^"\\\]*)*"\s*,\s*"\s*)'
 # . $whatyouwanttofind .
 # '(\s*"\s*\))|(locale\s*\(\s*\'[^\'\\\]*(?:\\\.[^\'\\\]*)*\'\s*,\s*\'\s*)'
 # . $whatyouwanttofind .
 # '(\s*\'\s*\)))/';
 # 
 # REPLACE:  ${1}$whatyouwanttoreplace${2}

 (?s)
 (?|
      (                             # (1 start)
           locale
           \s* 
           \(
           \s* 
           " [^"\\]* (?: \\ . [^"\\]* )* " 
           \s* , \s* 
           " 
           \s* 
      )                             # (1 end)
      what you want to find
      (                             # (2 start)
           \s* 
           " 
           \s* 
           \)
      )                             # (2 end)
   |  
      (                             # (1 start)
           locale
           \s* 
           \(
           \s* 
           ' [^'\\]* (?: \\ . [^'\\]* )* ' 
           \s* , \s* 
           ' 
           \s* 
      )                             # (1 end)
      what you want to find
      (                             # (2 start)
           \s* 
           ' 
           \s* 
           \)
      )                             # (2 end)
 )