Преобразование сокращения, найденного в нескольких строках, в полное слово - PHP - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь манипулировать несколькими строками в 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 для преобразования всех упоминаний от pwr до power?

Спасибо!


$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;
  }
 }
}

1 Ответ

0 голосов
/ 07 ноября 2018

Как я уже сказал в комментариях

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


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

Тогда вы просто добавляете больше слов и заменяете их. Preg Replace лучше, потому что вы можете использовать \b или границу слова, которая предотвращает такие вещи, как pwr в pwrstr или что у вас есть. \b соответствует \W или не \w или по-английски (смеется), что-нибудь не a-z A-Z 0-9 и _.

Замена строки может соответствовать части слова, которой вы не хотите рисковать.

Еще одно преимущество preg_replace - это \b(pwr|powr)\b, где вы можете сопоставить оба из них и заменить их одним и тем же. () - это группа захвата, здесь я использую ее просто для группировки слов, чтобы не повторять \b. И | - это ИЛИ.

Последнее, что вы можете использовать флаг i (после конечного разделителя /foo/i), чтобы сделать его нечувствительным к регистру. С str_ireplace() вы можете сделать то же самое, но вы не можете дифференцировать для каждого матча, как вы можете с preg_replace().

Оба работают с массивами, поэтому вам не нужно циклически повторять многократную замену с помощью str_repace() или preg_replace().

Если вам нужна помощь или просто для проверки регулярных выражений, этот сайт является одним из лучших тестовых сайтов Regex в районе https://regex101.com/ (IMO). Тем не менее, есть небольшая разница (вероятно, вы ничего не заметите), но есть еще один хороший сайт http://preg_replace.onlinephpfunctions.com/. Если вы посмотрите на навигацию, в ней есть куча вещей с песочницей PHP.

Ура!

...