Проблемы с str_replace не работают должным образом

Я делаю поле ввода текста формы для инвентарного списка. Я ввожу все в форму, и она разбивает все на части, чтобы поместить в SQL (пока не в части SQL).

Ввод будет выглядеть примерно так

5-1 1/2 черный 90° сч 40 (иметь 10 штук сч 80)

количество - размер - название фитинга (комментарии)

Я получил все в своей собственной переменной, теперь мне просто нужно удалить часть «(комментарии)» из имени фитинга. str_replace должен помочь, но, похоже, он работает только «несколько раз»? Я не уверен, почему это не всегда работает. На картинке ниже показано, что это сработало только 2 раза. Что касается моего регулярного выражения, я действительно плох в них. lol Спасибо за любую помощь, которую вы можете оказать с моей маленькой проблемой.

foreach ($components as $value) {
    $value=stripslashes($value);
            // get rid of empty lines       
             if  (empty($value)) { continue; }
            // will Split the amount of fittings from the value.
            $quantity = explode("-", $value);
            //Will split the name of the fitting and also give the size of the fittings.
            $test=preg_split('/([a-w]|[A-W])/', $quantity[1],2, PREG_SPLIT_DELIM_CAPTURE);
            //split the comments from the fitting name.
            $comments = explode("(", $test[2]);
            //removes the remaining ) from the left side
            $comments =preg_replace("/\)/", "" , $comments[1]);
 
                    if (!empty($comments)) {
                        $fitting_name = str_replace("($comments)","", $test[1].$test[2]);
                        }else{
                        $fitting_name = $test[1].$test[2];
                        }
        // The table format is just to make sure everything is working right before inputting into SQL
 echo "
  <tr>
    <td>$value</td>
    <td>". $quantity[0] ."</td>
    <td>$test[0]</td>
    <td>$fitting_name</td>
    
    <td>$comments  </td>
  </tr>
  <tr>

";          
        
}
  echo "</tr>
</table>";
}     

Вход

0-1/2 PP union 
1- 1 1/2x1 1/4 copper PP fitting red
9- 1 1/2" copper PP 90°
5-2" copper PP 90°    (have 10 of the sch 80 ones) 
13-2" copper PP Tee (have 10 of the sch 80 ones) 
10-1*1*3/4 copper PP tee


60- 3/4"  PP cap and chain value 
50 - 3/4" PP value (we only have 4 more)
19- 3/4" threaded cap and chain value 
0-2" threaded value 
0- 2 1/2" threaded value (have 10 of the sch 80 ones) 


5- 3/4" black Street 90°
0 - 3/4 black union 
0- 1" black union 
0-1" black tee 
1 - 1 1/2 black union 
6-1 1/4 black cap
7-1 1/2" * 1" black bushing
3 - 1 1/2 black coupling 
5-1 1/2 black 90° sch 40? (have 10 of the sch 80 ones) 



4 - 3/8" rod 6'
4-3/8" rod 10'
6 - 1/2" rod 6'
0-5/8" rod 6"
0-5/8" rod 10'
0-3/4 rod 6'
2 - 1" rod 6'(have 10 of the sch 80 ones) 

Каков ваш ожидаемый результат? Мне трудно определить случаи, когда вы говорите, что это не работает.

El_Vanja 14.12.2020 09:46

Мне нужно было удалить «(иметь 10 шт. 80 шт.)» из столбца имени фитинга. Код у меня работал только 2 раза из 6 по какой-то причине. Кен Ли смог заставить его работать, добавив обрезку в файл str_replace. Пока не уверен, почему это сработало, надо будет спросить его позже.

SnakZ Maynard 14.12.2020 11:58

@SnakZMaynard, потому что места слишком много. "(foo bar) ". Вы удаляете скобки, чтобы получить "foo bar", а затем заменяете их скобками. В моем примере вы получаете "(foo bar) " и пытаетесь заменить "(foo bar )"

Cid 14.12.2020 12:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Пожалуйста, попробуйте изменить следующую строку

$fitting_name = str_replace("($comments)","", $test[1].$test[2]);

к

$fitting_name = str_replace("(" . trim($comments).")","", $test[1].$test[2]);

и увидеть эффект. Пожалуйста, сообщите нам результат.

это сделало трюк, мне нужно было изменить только одну вещь, так как она вырезала последнюю. изменить $test[1]." " . От $test[2] до $test[1].$test[2]

SnakZ Maynard 14.12.2020 09:53

приятно знать, что вы решили проблему. Пожалуйста, отметьте его ответом, чтобы мы могли закрыть его.

Ken Lee 14.12.2020 09:54

Это будет работать до тех пор, пока не будет что-то вроде "( hello world )"

Cid 14.12.2020 12:25
Ответ принят как подходящий

Я бы сначала удалил комментарий, прежде чем выполнять какой-либо синтаксический анализ, чтобы очистить ввод.

Вы можете извлечь его с помощью RegEx:

\s*\(.*?\)

\s* соответствует 0 или более пробелам

\( соответствует скобке

.*? соответствует любым символам (ленивое совпадение)

\) соответствует скобке

Теперь вы можете заменить это пустой строкой:

<?php
$input = [
    "0-1/2 PP union ",
    "1- 1 1/2x1 1/4 copper PP fitting red",
    "9- 1 1/2\" copper PP 90°",
    "5-2\" copper PP 90°    (have 10 of the sch 80 ones) ",
    "13-2\" copper PP Tee (have 10 of the sch 80 ones) ",
    "10-1*1*3/4 copper PP tee",
    "",
    "",
    "60- 3/4\"  PP cap and chain value ",
    "50 - 3/4\" PP value (we only have 4 more)",
    "19- 3/4\" threaded cap and chain value ",
    "0-2\" threaded value ",
    "0- 2 1/2\" threaded value (have 10 of the sch 80 ones) ",
    "",
    "",
    "5- 3/4\" black Street 90°",
    "0 - 3/4 black union ",
    "0- 1\" black union ",
    "0-1\" black tee ",
    "1 - 1 1/2 black union ",
    "6-1 1/4 black cap",
    "7-1 1/2\" * 1\" black bushing",
    "3 - 1 1/2 black coupling ",
    "5-1 1/2 black 90° sch 40? (have 10 of the sch 80 ones) ",
    "",
    "",
    "",
    "4 - 3/8\" rod 6'",
    "4-3/8\" rod 10'",
    "6 - 1/2\" rod 6'",
    "0-5/8\" rod 6\"",
    "0-5/8\" rod 10'",
    "0-3/4 rod 6'",
    "2 - 1\" rod 6'(have 10 of the sch 80 ones) "
];

foreach ($input as $value)
{
    $newValue = preg_replace("#\s*\(.*?\)#", "", $value);
    echo $newValue . PHP_EOL;
}

Выход :

0-1/2 PP union 
1- 1 1/2x1 1/4 copper PP fitting red
9- 1 1/2" copper PP 90°
5-2" copper PP 90° 
13-2" copper PP Tee 
10-1*1*3/4 copper PP tee


60- 3/4"  PP cap and chain value 
50 - 3/4" PP value
19- 3/4" threaded cap and chain value 
0-2" threaded value 
0- 2 1/2" threaded value 


5- 3/4" black Street 90°
0 - 3/4 black union 
0- 1" black union 
0-1" black tee 
1 - 1 1/2 black union 
6-1 1/4 black cap
7-1 1/2" * 1" black bushing
3 - 1 1/2 black coupling 
5-1 1/2 black 90° sch 40? 



4 - 3/8" rod 6'
4-3/8" rod 10'
6 - 1/2" rod 6'
0-5/8" rod 6"
0-5/8" rod 10'
0-3/4 rod 6'
2 - 1" rod 6' 

Попробуйте сами

Был на работе в течение довольно долгого времени, поэтому не смог проверить его, пока не узнал. Ваш способ решения проблемы намного лучше, как вы сказали, он касается проблемы, которая может возникнуть у меня в будущем. Спасибо за помощь Сид.

SnakZ Maynard 15.12.2020 09:49

Другие вопросы по теме