【问题标题】:Converting an abbreviation found in multiple strings to the full word - PHP将在多个字符串中找到的缩写转换为完整的单词 - PHP
【发布时间】:2018-11-06 21:58:30
【问题描述】:

我正在尝试在 PHP 中操作多个字符串。我正在使用foreach 循环和if statements 提取数组数据。一些数组数据以缩写形式存储。我想将这些缩写转换为完整的单词。一个例子是缩写pwr,它代表power。该缩写可以在各种不同的上下文中找到。下面我将附上我的 PHP 代码及其各自的输出,您可以在其中看到可以找到 pwr 缩写的各种字符串。

PHP:

<?php

foreach ($finaltitle as $titlenumber => $titlename){
 foreach ($techData as $tsnumber => $tsname){
  if ($tsnumber == $titlenumber){
    if(empty($tsname) or $tsname === '- TBD -') continue;

    $finaltsdata = "<b>".$titlename." (".$tsnumber.") "."</b>: ".strtolower($tsname)."<br>";
    echo $finaltsdata;
  }
 }
}

?>

输出:

Suspension Type - Front (105) : 4-link,
Suspension Type - Rear (106) : trapezoidal link,
Suspension Type - Front (Cont.) (107) : pwr-adjustable sport
Suspension Type - Rear (Cont.) (108) : pwr-adjustable sport
Front Tire Size (140) : p235/40yr18
Rear Tire Size (141) : p235/40yr18
Spare Tire Size (142) : p235/40yr18
Front Wheel Size (156) : 18 x 8.0
Rear Wheel Size (157) : 18 x 8.0
Spare Wheel Size (158) : 18 x 8.0
Front Wheel Material (165) : alloy
Rear Wheel Material (166) : alloy
Spare Wheel Material (167) : alloy
Steering Type (176) : pwr rack & pinion
Steering Ratio (:1), Overall (178) : 16.3
Turning Diameter - Curb to Curb (184) : 37.7
Brake Type (186) : pwr

注意缩写pwr 可以在各种不同的上下文中找到:单独、在一组单词之前、在破折号之前等。如何在我的foreach 代码中创建一个语句来转换所有提及从pwrpower

谢谢!


$array = [
 '/\b(pwr|Pwr|powr)\b/i' => 'power',
];

$tsname = preg_replace(array_keys($array), $array);


foreach ($finaltitle as $titlenumber => $titlename){
 foreach ($techData as $tsnumber => $tsname){   
  if ($tsnumber == $titlenumber){
    if(empty($tsname) or $tsname === '- TBD -') continue;
    $finaltsdata = "<b>".$titlename." (".$tsnumber.") "."</b>: ".$tsname."<br>";
    echo $finaltsdata;
  }
 }
}

【问题讨论】:

  • 尝试使用 str_replace :strtolower(str_replace('pwr', 'power', $tsname))
  • 我会使用 preg_replace 因为它允许您使用单词边界,例如 /\bpwr\b/ 我会创建一个像这样的数组 ['/\bpwr\b/' =&gt; 'power'] 然后使用 preg_replace(array_keys($array), $array) 简单,您可以添加更多 @987654338 @真的很容易..

标签: php if-statement foreach abbreviation


【解决方案1】:

正如我在 cmets 中所说的

 $array = [
    '/\bpwr\b/i' => 'power',
    '/\bbrk\b/i' => 'brake'
 ];


 $str = preg_replace(array_keys($array), $array, $str);

然后您只需添加更多单词并替换它们。 Preg Replace 更好,因为您可以使用 \b 或单词边界来防止在 pwrstr 中匹配 pwr 或其他内容。 \b 匹配 \W 或不匹配 \w 或英语 (lol) 任何不匹配 a-z A-Z 0-9_

字符串替换可以匹配一个单词的一部分,你真的不想冒险。

preg_replace 的另一个优点是\b(pwr|powr)\b,您可以在其中匹配这两个并用相同的东西替换它们。 () 是一个捕获组,在这里我只使用它来对单词进行分组,这样\b 就不必重复了。 | 是 OR。

最后一件事是您可以使用i 标志(在结束分隔符/foo/i 之后)使其不区分大小写。使用str_ireplace(),您可以做同样的事情,但您不能像使用preg_replace() 那样在每场比赛的基础上进行区分。

两者都适用于数组,因此您不必自己使用str_repace()preg_replace() 循环多个替换。

如果您需要帮助,或者只是为了测试正则表达式,这个站点是https://regex101.com/ (IMO) 周围最好的正则表达式测试站点之一。也就是说,有一些细微的差别(你可能不会注意到),但另一个好的网站是这个 http://preg_replace.onlinephpfunctions.com/ 。如果你看它上面的导航,它有一堆 PHP 沙盒的东西。

干杯!

【讨论】:

  • 可以使用手册的链接...php.net/manual/en/function.preg-replace.php
  • @ArtisticPhoenix 我真的很喜欢这个,主要是因为我不想匹配你提到的单词的一部分。我用修改后的代码更新了问题的底部。对我来说仍然没有完全发挥作用,但我会继续调整直到它发挥作用。谢谢!
  • @mugelloblue 还要注意 /i pattern modifier 使模式不区分大小写。所以a 也将匹配A
  • @mugelloblue - 我忘记了第三个参数,这是要进行替换的主题字符串。另外,您可能(可能)必须将它放入您的循环中,如果没有更多关于某些 $variables 含义的上下文,我真的无法告诉您将它放在代码中的哪个位置。
  • @ArtisticPhoenix 就在您评论我添加了第三个参数之前,效果很好!再次感谢。
猜你喜欢
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
  • 2015-01-05
  • 2021-02-23
相关资源
最近更新 更多