Преобразуйте запятую в точку с запятой для определенной части строки, используя PHP
У меня есть строка, которая такая,
$input = "div-item-2,4,maintype:social| heading:sdfsdf| social: 1, 2, 3 | table:Social| item:3| align:vertical| style:icon| isactive:1,8,0";
Я хотел бы преобразовать запятую в точку с запятой между | это начало и конец. Это может быть проиллюстрировано ниже изображением ниже,
Таким образом, строка будет преобразована, как показано ниже,
$output = "div-item-2,4,maintype:social| heading:sdfsdf| social: 1; 2; 3 | table:Social| item:3| align:vertical| style:icon| isactive:1,8,0";
Ниже приведен еще один пример,
$input = "div-item-0,4,maintype:menu| heading:Quick, Link| table:Menu | menuid:1| align:vertical| style:icon| isactive:1,0,0";
$output = "div-item-0,4,maintype:menu| heading:Quick; Link| table:Menu | menuid:1| align:vertical| style:icon| isactive:1,0,0";
Такой же случай может быть ниже,
$input = "div-item-1,4,maintype:text| heading: Name | title: Learn from here| logo:/photos/20/01.jpg| description: This is some description, so you can stay with us| isactive:1,4,0";
$output= "div-item-1,4,maintype:text| heading: Name | title: Learn from here| logo:/photos/20/01.jpg| description: This is some description; so you can stay with us| isactive:1,4,0";
3 ответа
Вы можете использовать это регулярное выражение, чтобы делать то, что вы хотите:
((\||(?<!^)\G)[^,|]*),(?=.*\|)
Выглядит для
- либо
|
или начало строки после предыдущего совпадения (\G
), - с последующим некоторым количеством не
|
или же,
персонажи, - с последующим
,
- с последующим некоторым количеством символов, а затем
|
Обратите внимание, что \G
будет также соответствовать началу строки, отрицательный взгляд за (?<!^)
мешает это делать.
Символы между началом матча и ,
захвачены в группе 1, и строка замены $1;
, В PHP:
echo preg_replace('/((\||(?<!^)\G)[^,|]*),(?=.*\|)/', '$1;', $input);
Попробуй это..
function replaceSTR( $string, $search, $replace, $separator, $start, $end ){
/*
* note that this is base on your sample
* string of course your string
* search for ,
* replace it with ;
* your separator is |
* in your sample your start is 1
* end is 3
*/
$result = array();
$string = explode( $separator, $string );
foreach( $string as $key => $value ){
if( $key < $start || $key > $end ){
$result[] = $value;
}else{
$result[] = str_replace(",",";",$value);
}
}
return implode("|",$result);
}
Не уверен, но, возможно, это выражение может вернуть желаемый результат:
$re = '/(?:^[^|]*|(?<=\|)(?:[^,]*)(?=\|)|[^|]*$|[^,\r\n]*)|(,)/m';
$str = 'div-item-2,4,maintype:social| heading:sdfsdf| social: 1, 2, 3 | table:Social| item:3| align:vertical| style:icon| isactive:1,8,0
div-item-0,4,maintype:menu| heading:Quick, Link| table:Menu | menuid:1| align:vertical| style:icon| isactive:1,0,0"
div-item-1,4,maintype:text| heading: Name | title: Learn from here| logo:/photos/20/01.jpg| description: This is some description, so you can stay with us| isactive:1,4,0';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
$output = '';
foreach ($matches as $key => $value) {
if ($value[1] == ',') {
$output .= ';';
} else {
$output .= $value[0];
}
}
var_dump($output);
Выход
string(413) "div-item-2,4,maintype:social| heading:sdfsdf| social: 1; 2; 3 | table:Social| item:3| align:vertical| style:icon| isactive:1,8,0div-item-0,4,maintype:menu| heading:Quick; Link| table:Menu | menuid:1| align:vertical| style:icon| isactive:1,0,0"div-item-1,4,maintype:text| heading: Name | title: Learn from here| logo:/photos/20/01.jpg| description: This is some description; so you can stay with us| isactive:1,4,0"
Если вы хотите изучить / упростить / изменить выражение, это было объяснено на верхней правой панели regex101.com. Если вы хотите, вы также можете посмотреть в этой ссылке, как она будет сопоставляться с некоторыми примерами входных данных.