Я делаю поле ввода текста формы для инвентарного списка. Я ввожу все в форму, и она разбивает все на части, чтобы поместить в 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)
Мне нужно было удалить «(иметь 10 шт. 80 шт.)» из столбца имени фитинга. Код у меня работал только 2 раза из 6 по какой-то причине. Кен Ли смог заставить его работать, добавив обрезку в файл str_replace. Пока не уверен, почему это сработало, надо будет спросить его позже.
@SnakZMaynard, потому что места слишком много. "(foo bar) "
. Вы удаляете скобки, чтобы получить "foo bar"
, а затем заменяете их скобками. В моем примере вы получаете "(foo bar) "
и пытаетесь заменить "(foo bar )"
Пожалуйста, попробуйте изменить следующую строку
$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]
приятно знать, что вы решили проблему. Пожалуйста, отметьте его ответом, чтобы мы могли закрыть его.
Это будет работать до тех пор, пока не будет что-то вроде "( hello world )"
Я бы сначала удалил комментарий, прежде чем выполнять какой-либо синтаксический анализ, чтобы очистить ввод.
Вы можете извлечь его с помощью 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'
Был на работе в течение довольно долгого времени, поэтому не смог проверить его, пока не узнал. Ваш способ решения проблемы намного лучше, как вы сказали, он касается проблемы, которая может возникнуть у меня в будущем. Спасибо за помощь Сид.
Каков ваш ожидаемый результат? Мне трудно определить случаи, когда вы говорите, что это не работает.