【问题标题】:php - regex replacing strings with braces and quotesphp - 正则表达式用大括号和引号替换字符串
【发布时间】:2013-02-14 06:46:13
【问题描述】:

我在这里看到了很多关于一般正则表达式的问题,但问题是它们通常(像我的一样)非常本地化,如果不是正则表达式专家,很难推断出来..

我的字符串包含引号和大括号等字符,它们以使正则表达式更加困难而闻名。

我想知道执行此任务所需的表达式字符串(搜索、替换)。

换句话说,在:

 ereg_replace (string pattern, string replacement, string subject) 

我需要string patternstring replacement 表达式。

我的字符串是

array('val' => 'something', 'label' => 'someword'),

我需要更改最后一部分:

'label' => 'someword'),

'label' => __('someword','anotherstring')),

我将为此使用 php,但我也想使用 Notepad ++ 对其进行测试(并在其他情况下使用)。 (我不知道它是否真的改变了搜索和替换字符串)。

请注意,字符串someword 也可以是SomeWordSOMEWORD 甚至Some wordSome_Word 在大小写上,这意味着它可以包含空格、下划线或实际上几乎任何字符...)

编辑我:忘了说__() 部分当然是用于翻译的wordpress 文本域功能。例如__('string','texdomain')

编辑二:

很抱歉,如果我在 cmets 中过于迫切或要求过高,我确实会尝试理解,而不仅仅是复制粘贴在其他情况下可能对我不起作用的解决方案.. :-)

编辑三:

THIS 工具的帮助下,我了解到我的基本误解是在 regex 中使用 VARIABLES 的可能性。 $1 实际上是我更好理解所需要的。

在记事本++中也可以使用的(非常简单的)模式

Pattern: 'label' => ('.*')

Replace: 'label' => __(\1,'textdomain')

(在notepad++中它被称为Tag Region (not var),它被标记为\1

【问题讨论】:

  • 我不明白你到底想要什么,'label' => 'someword') 到 'label' => __('someword','anotherstring')) ?
  • @Akam - 是的.. 但someword 部分是未知字符串,而不是字面意义上的someword。它可以是任何东西.. anotherstring 部分但是是一个固定的字符串。
  • @ObmerkKronen 正则表达式不是很灵活。对于您的问题this 中提供的给定输入和输出,将为您提供所需的结果。正则表达式模式是:'label' => ('.*') 如果您只需要使用 IDE 快速替换就足够了。
  • 'label' => '*' 基本上是您尝试匹配的模式(即您是否总是尝试将值替换为标签键)?
  • @MikeBrant - 实际上我想用 __('originalvalue','anotherstring') 包装该值

标签: php regex wordpress notepad++


【解决方案1】:

如果您一直在寻找label 密钥,您应该可以执行以下操作:

$pattern = "/array\((.*), 'label' => '(.*)'/U";
$added_string = 'anotherstring';
$replacement = 'array($1, ' . "'label' => __('" . '$2' . "','$added_string'";
$final_string = preg_replace($pattern, $replacement, $original_string);

【讨论】:

  • 那么就纯正则表达式而言,搜索模式是什么,替换模式是什么? (很抱歉,当涉及到正则表达式时,一些字符(如大括号、变量、美元符号和引号)令人困惑,因为我从不相信自己知道它们是正则表达式的一部分还是编程语言的一部分(如变量)。跨度>
  • 显示的整个$pattern 是正则表达式。 $replacement 不是正则表达式,但它确实使用反向引用 $1$2 从正则表达式中捕获的子模式。替换中的$added_string 部分只是一个变量,其中包含需要添加的其他字符串。如果这是一个常量值,您可以轻松地在此处省略变量的使用。请注意,不要在注意反向引用的字符串区域周围使用双引号(除非您想使用 \\1 语法进行反向引用。
  • 好的,$pattern 中的第一个 '/' 只是转义,还是正则表达式的一部分?
  • 你真的应该花时间阅读正则表达式的正确使用,因为它是一个非常强大的工具,可以放在你的工具箱中。任何经验丰富的开发人员都应该至少具备基本的正则表达式技能。
  • @ObmerkKronen Here's 很棒的工具。玩弄它。有一些模式在做什么的简要说明。把它们放在一起,你几乎总能得到你需要的东西。一切复杂的东西都由简单的部分组成。 :)
【解决方案2】:

对于问题模式中的给定输入和输出:'label' => ('.*') 足以匹配字符串并执行替换。此模式匹配字符串中的以下部分:'label' => ' 之间的任何字符。大括号中的部分模式将 ' 之间的任何字符 分组,以后可以使用 $1 访问这些字符。例如:

$str = "array('val' => 'something', 'label' => 'some testing string_with\$specialchars\/'),";
$str = preg_replace('/\'label\' => (\'.*\')/', '\'label\' => __($1, \'some other string\')', $str);
echo $str;
//Outputs:
//   array('val' => 'something', 'label' => __('some testing string_with$specialchars\/', 'some other string')),

【讨论】:

  • 再次感谢 - 您发布的链接 codepad.viper-7.com/dxXTId 演示并且运行良好(由将阅读此答案的人重新发布以供将来参考)
  • @ObmerkKronen 不客气。我很高兴能帮助你。 ;)
  • @ 看我上次的编辑,实际上,我的理解缺少的是 '$1' 变量。
【解决方案3】:
<?php
$strings = array('some word', 'some Word', 'SOMEword', 'SOmE_Word', 'sOmE_ WOrd');
$pattern = '/([a-z]+)([^a-z]*)([a-z]+)/i';
foreach($strings as $v){
 echo preg_replace($pattern, 'otherword', $v)."<br>";
}
?> 

输出:

otherword
otherword
otherword
otherword
otherword

编辑:

$pattern = "/('label'\s=>\s')(([a-z]+)([^a-z]*)([a-z]+))('\),)/i";
$otherword = 'otherword';
$replacement = "'label' => __('$2','$otherword')),";
echo preg_replace($pattern, $replacement, "'label' => 'someword'),");

输出:

'label' => __('someword','otherword')),

DEMO

【讨论】:

  • 感谢您的回答,但我相信这只会做一个简单的替换,而不是一个函数的包装。此外,它并不涉及(,)=等所有麻烦制造者
  • 你能清楚地提供匹配词(模式)列表和替换列表吗?
猜你喜欢
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
相关资源
最近更新 更多