【问题标题】:PHP String Search and Replace wildcard for numbers written in textPHP字符串搜索和替换以文本形式写入的数字的通配符
【发布时间】:2013-12-11 22:35:22
【问题描述】:

我四处搜索,找不到针对这种特定情况的简单解决方案。我不是 PHP 专业人士,我还在学习。

我正在对以文本形式写入的数字执行字符串搜索和替换,以将它们转换回数字。一个小例子如下所示:

$n_0='twenty one'; $n_1='twenty two'; $n_2='twenty three'; $n_3='twenty four'; $n_4='twenty five'; $n_5='twenty six'; $n_6='twenty seven'; $n_7='twenty eight'; $n_8='twenty nine'; $n_9='thirty one';

$r_0='21'; $r_1='22'; $r_2='23'; $r_3='24'; $r_4='25'; $r_5='26'; $r_6='27'; $r_7='28'; $r_8='29'; $r_9='31';

$search = array($n_0, $n_1, $n_2, $n_3, $n_4, $n_5, $n_6, $n_7, $n_8, $n_9, $n_10, $n_11, $n_12, $n_13, $n_14, $n_15, $n_16, $n_17, $n_18, $n_19, $n_20, $n_21, $n_22);

$replace = array($r_0, $r_1, $r_2, $r_3, $r_4, $r_5, $r_6, $r_7, $r_8, $r_9, $r_10, $r_11, $r_12, $r_13, $r_14, $r_15, $r_16, $r_17, $r_18, $r_19, $r_20, $r_21, $r_22);

$string = str_ireplace($search, $replace, $string);

有没有办法定义一个“单一”的 PHP 变量,以便找到所有给定的条件?

例如:

Search for: $n_0='twenty???one';
Replace with: $r_0 = '21';

其中 ??? 是介于“二十”和“一”之间的通配符代码,可以使其适用于以下所有搜索案例。

搜索:

$n_0='twenty one';
$n_0='twenty, one';
$n_0='twenty,one';
$n_0='twenty-one';
$n_0='twenty:one';
$n_0='twenty_one';
$n_0='twenty*one';
$n_0='twenty(one';
$n_0='twenty)one';
$n_0='twentyone';

提前致谢。

【问题讨论】:

  • 使用preg_replace而不是str_ireplace,并使用带有通配符的正则表达式。
  • @Barmar 怎么做?示例会有所帮助。
  • 这似乎是一个非常琐碎的正则表达式,但我还是发布了一个答案。

标签: php regex search replace


【解决方案1】:
$n_0 = '/twenty[-\s,:_()*]*one/';
...
preg_replace($search, $replace, $string);

【讨论】:

    【解决方案2】:

    下面的正则表达式可以:

    preg_replace('/twenty(?:[-:_\*\(\)]|,? ?)one/', '21', $n_0);
    

    它的作用是:

    • 搜索包含“二十”的字符串
    • 后跟任何 - : _ * ( 或 ) OR 后跟一个可选的逗号,后跟一个可选的空格
    • 后跟“一”

    【讨论】:

      【解决方案3】:

      试试这个:

      $pattern = array('/twenty[^a-zA-Z]*?one/','/twenty[^a-zA-Z]*?two/');
      $replace = array('21','22');
      $result = preg_replace($pattern, $replace, "I love twentyone but really love twenty238two");
      
      echo $result;
      

      【讨论】:

      • 用字符串I love twenty but not two试试你的例子。
      • @Tom Pace 是否有通配符来替换 ???在 $n_0='二十???一。我有超过 100 个文本数字组合要替换。我只需要在单词之间替换一个字符。
      • 我建议.*?它懒洋洋地捕捉到 20 到 1 之间的任何东西。但正如 Barmar 所说,它将用“我爱 22”代替“我爱 20 岁而不是 2 岁”之类的内容。
      • @Sammy 我从 .* 修复了正则表达式?到 [^a-zA-Z]*?。它涵盖了 Barmar 的观点。
      • @Sammy 这个正则表达式是一个包罗万象的正则表达式,它会捕捉到您的示例未涵盖的其他内容。比如“twenty#one”和“twenty!one”……我不知道这对你是否重要。
      猜你喜欢
      • 2014-02-11
      • 2015-03-19
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多