如何在某些字符串中查找和替换单引号?

时间:2019-07-08 16:29:08

标签: php regex

因为断言-在7.2版本更改后,需要使用字符串检查断言是否为FALSE,因为自PHP 7.2起断言已断言。

我想将replace in path php storm函数与regex一起使用,更改所有点,这是正则表达式吗?

示例示例:

assert('is_array($config)');
assert('is_string($location)');
assert('is_string($entityId)');

我刚刚找到并替换了第一引号,就像这样 .*?(\bassert\('\b)[^$]*替换为assert(。但是我不知道最后报价的情况。

结果必须是

assert(is_array($config));
assert(is_string($location));
assert(is_string($entityId));

我找到第一个单引号的解决方案,需要找到最后一个单引号的解决方案

有任何同伴吗?

2 个答案:

答案 0 :(得分:1)

我们最好从具有更多边界的表达式开始,例如:

.*?(\bassert\b)\s*\(('|")\s*([^'"]*?)\s*('|")\s*\)\s*;

测试

$re = '/.*?(\bassert\b)\s*\((\'|")\s*([^\'"]*?)\s*(\'|")\s*\)\s*;/s';
$str = 'assert ("  is_string($entityId)") ;';
$subst = '$1($3);';

echo preg_replace($re, $subst, $str);

该表达式在this demo的右上角进行了说明,如果您想进一步探索或修改它,在this link中,您可以逐步观察它如何与某些示例输入匹配步骤,如果您愿意的话。

答案 1 :(得分:1)

仅匹配单引号的一个选项可以是使用\G在上一次匹配的末尾声明位置。利用\K忘记当前匹配的内容,然后匹配单引号。

在替换中,使用一个空字符串。

(?:^.*?\bassert\(|\G(?!^))[^']*\K'(?=.*\);)

关于图案

  • (?:非捕获组
    • ^.*?\bassert\(从字符串的开头以非贪婪的方式进行匹配,直到遇到assert(
    • |
    • \G(?!^)在上一场比赛而不是开始时断言位置
  • )关闭非捕获组
  • [^']*\K'匹配0次以上而不是',忘记匹配的内容并匹配'
  • (?=.*\);)断言右边是右括号和;

Regex demo

另一种方法是使用3个捕获组,匹配要删除的'并在替换中使用这些组:

^(.*?\bassert\()'([^']+)'(.*)$

Regex demo