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)
)