正则表达式找到并替换

时间:2014-07-14 15:53:32

标签: php regex

我有这样的文字:

_e('Don\'t change this 1...', 'text_to_change');
_e('Don\'t change this extra...', 'text_to_change');
_e('Don\'t change this te...', 'text_to_change');
_e('Don\'t change this text...', 'text_to_change');

如何在PHP中将'text_to_change'替换为其他内容。我想我应该使用preg_replace,但事实是我不知道如何使用正则表达式。

我需要的结果:

_e('Don\'t change this 1...', 'some_text');
_e('Don\'t change this extra...', 'some_text');
_e('Don\'t change this te...', 'some_text');
_e('Don\'t change this text...', 'some_text');

我需要它与正则表达式没有其他解决方案。 谢谢。

3 个答案:

答案 0 :(得分:2)

您可以使用以下正则表达式:

_e\('.*',\s*'\K[^']*

Explanation

示例

$text = <<<DATA
_e('Don\'t change this 1...', 'text_to_change');
_e('Don\'t change this extra...', 'text_to_change');
_e('Don\'t change this te...', 'text_to_change');
_e('Don\'t change this text...', 'text_to_change');
DATA;

$text = preg_replace("/_e\('.*',\s*'\K[^']*/", 'some_text', $text);
echo $text;

<强>输出

_e('Don\'t change this 1...', 'some_text');
_e('Don\'t change this extra...', 'some_text');
_e('Don\'t change this te...', 'some_text');
_e('Don\'t change this text...', 'some_text');

答案 1 :(得分:1)

您可以使用preg_replace,但如果您只想更改固定字符串,则没有多大意义。为什么不使用str_replace

$newString = str_replace('text_to_change', 'some_text', $oldString);

如果您担心文本preg_replace可能出现在其他地方,则值得使用'text_to_change'。在这种情况下,我猜你可以编写一个正则表达式来匹配那些特定的行。这可能类似于:

$pattern = "^_e\('(.+)', 'text_to_change'\);$";
$newString = preg_replace($pattern, "_e('\1', 'some_text');", $oldString);

如果你正在使用Linux,那么从命令行使用findsed可能更容易,而不是编写自定义PHP脚本:

find . -type f -name '*.php' -exec sed -ir "s/_e\('(.+)', 'text_to_change'\);/_e('\1', 'some_text');/" {} \;

在这里,我们使用find查找当前目录(-type f)中名称为.的所有文件(*.php)。然后,我们致电sed更改所提供文件的原位(-i

答案 2 :(得分:1)

下面的正则表达式会匹配第二个单引号内的文本。只需将匹配的字符串替换为some_text

(?<= \')[^']*

DEMO

您的PHP代码将是,

<?php
$string = <<<'EOT'
_e('Don\'t change this 1...', 'text_to_change');
_e('Don\'t change this extra...', 'text_to_change');
_e('Don\'t change this te...', 'text_to_change');
_e('Don\'t change this text...', 'text_to_change');
EOT;
$pattern = "~(?<= \')[^']*~";
$replacement = 'some_text';
echo preg_replace($pattern, $replacement, $string);
?>

<强>输出:

_e('Don\'t change this 1...', 'some_text');
_e('Don\'t change this extra...', 'some_text');
_e('Don\'t change this te...', 'some_text');
_e('Don\'t change this text...', 'some_text');

<强>解释

  • (?<= \') Lookbehind实际上用于管理与特定模式匹配的字符串。在我们的例子中,它会查找字符串'(即空格后跟单引号)。第二个引号满足这个条件。因此,正则表达式引擎仅在第二个单引号之后设置匹配标记。

  • [^']*匹配任何不是单引号的字符,零次或多次。