【问题标题】:PHP preg_replace insert a string where there is nonePHP preg_replace 在没有字符串的地方插入一个字符串
【发布时间】:2019-01-11 19:19:05
【问题描述】:

我有一个包含字符串的变量 $var。

例子:

$var = "one, two , three = ?, four = 'val', five  , six = 1, seven, eight = 'val' , nine";

我想用 preg_replace() 编辑 $var,使 $var 看起来像这样:

"one = ?, two = ?, three = ?, four = 'val', five = ?, six = 1, seven = ?, eight = 'val', nine = ?"

我的意思是:如果该列没有分配值,请将其设置为 ' = ?' 并删除不必要的空格。

我尝试了以下正则表达式,但它甚至不接近:

$sql['set'] = preg_replace("/(\w+)\s?,/", "$1 = ?,", $sql['set']);

我研究了解决方案,但无法涵盖所有​​可能性。

【问题讨论】:

标签: php regex


【解决方案1】:

此正则表达式将处理您初始字符串中缺少的= ?,

([a-zA-Z]+)\s*(?:(,)|$)

当替换为\1 = ?\2 但要在逗号前修剪多余的空格时,您将需要另一个正则表达式+, 替换为,,因此您可以使用此代码在php 中使用此多重替换,

$var = "one, two , three = ?, four = 'val', five  , six = 1, seven, eight = 'val' , nine";
echo preg_replace(['/([a-zA-Z]+)\s*(?:(,)|$)/i', '/ +,/i'], ['\1 = ?\2', ','], $var);

这会提供您想要的输出,

one = ?, two = ?, three = ?, four = 'val', five = ?, six = 1, seven = ?, eight = 'val', nine = ?

【讨论】:

    【解决方案2】:

    确实快到了。

    • 你只需要*作为空间的量词而不是?。

    • 最好不要使用\w 来匹配键,因为那样也会意外匹配= 1。

    • 也许使用一些lookarounds 来确保之前没有=。

    我会选择类似的东西:

    preg_replace("/ (?<= ^|,|,\s)  ([a-z]+)  (?=\s*(,|$)) /x", "$1 = ?", $var)
    #                       ↑         ↑            ↑
    #              preceding comma   key   following comma / end
    

    前面的逗号匹配有点老套(只是寻找一个可选的空格),但如果你限制了允许的键名,也是多余的。

    【讨论】:

      【解决方案3】:

      这是一个非正则表达式解决方案:

      $var = "one, two , three = ?, four = 'val', five  , six = 1, seven, eight = 'val' , nine";
      $arr = explode(',', $var);
      foreach($arr as $i => $e)
      {
          $arr[$i] = (strpos($e, '=') === false) ? trim($e).' = ?' : trim($e);
      }
      
      echo implode(', ', $arr);
      

      【讨论】:

      • @Dharman - 我写得很快,只是为了给他一个想法。这是一个较短的版本。总有更好的短版本。
      • 您仍然可以将trim 减少为只调用一次。 array_map 甚至可能是更好的选择。
      【解决方案4】:

      另一种解决方案可能是使用explode 和array_map 并使用preg_match 检查值是否与键=值模式不匹配。如果没有,则将= ? 添加到值中。

      图案

      \w+\h*=\h*\S
      

      这将匹配

      • \w+\h* 匹配 1+ 个单词字符后跟 0+ 个水平空格
      • = 字面上匹配
      • \h*\S 匹配 0+ 个水平空格,然后匹配非空格字符

      例如

      $var = "one, two , three = ?, four = 'val', five  , six = 1, seven, eight = 'val' , nine";
      
      echo implode(', ', array_map(function($x){
          return preg_match('/\w+\h*=\h*\S/', $x) === 0 ? $x.' = ?' : $x;
      }, array_map("trim", explode(',', $var))));
      

      结果

      one = ?, two = ?, three = ?, four = 'val', five = ?, six = 1, seven = ?, eight = 'val', nine = ?
      

      Php demo

      如果不使用正则表达式并且列名本身不能包含等号,您可以使用strpos 来检查字符串是否包含=:

      $var = "one, two , three = ?, four = 'val', five  , six = 1, seven, eight = 'val' , nine";
      
      echo implode(', ', array_map(function($x){
          return strpos($x, '=') === false ? $x.' = ?' : $x;
      }, array_map("trim", explode(',', $var))));
      

      Php demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        • 2011-05-13
        • 2015-02-11
        • 1970-01-01
        • 2016-09-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多