PHP正则表达式和preg_replace问题3

时间:2014-09-16 08:29:44

标签: php regex preg-replace

我想改变这个:

$text='{i:0;s:8:"Par mail";}';

到:

$text="Par mail";

$ text ='{i:0; s:8:“Par mail”; i:1; s:7:“Par fax”;}};

到:

$ text =“Par mail | Par fax”;

其他人到第4个表达

为此,我使用PHP函数preg_replace

$text = preg_replace('/{i:[^\\[]?;s:[^\\[]?:"(.*?)";i:[^\\[]?;s:[^\\[]?:"(.*?)";/}','"$1 | $2"', $text);

我需要一些帮助,输入格式必须精确才能转换文本。 亲切

3 个答案:

答案 0 :(得分:0)

使用[^"]*代替.*?

{i:[^\\[]*?;s:[^\\[]*?:"([^"]*)";i:[^\\[]*?;s:[^\\[]*?:"([^"]*)";}

DEMO

<?php
$string = '{i:0;s:8:"Par mail";i:1;s:7:"Par fax";}';
$pattern = '~{i:[^\\[]*?;s:[^\\[]*?:"([^"]*)";i:[^\\[]*?;s:[^\\[]*?:"([^"]*)";}~';
$replacement = "$1 | $2";
echo preg_replace($pattern, $replacement, $string);
?>

输出:

Par mail | Par fax

答案 1 :(得分:0)

我走了preg_replace_callback路线。

<?php

$s = '{i:0;s:8:"Par mail";i:1;s:7:"Par fax";}';

$arrM = array();
preg_replace_callback("/(s\:[0-9]*\:\")([A-Z\ ]+)/i", function($arrMatches) use(&$arrM) {
   $arrM[] = $arrMatches[2];
}, $s);

echo implode(" | ", $arrM);  //Output: Par mail | Par fax

https://eval.in/194049

答案 2 :(得分:0)

我猜你的字符串前面有这些字符:a:2然后可以反序列化:

$text='a:2:{i:0;s:8:"Par mail";i:1;s:7:"Par fax";}';
$obj = unserialize($text);
print_r($obj);

<强>输出:

Array
(
    [0] => Par mail
    [1] => Par fax
)

在此反序列化后,您可以使用|加入值。

echo implode('|', $obj);// --> Par mail|Par fax