2012-06-06 54 views
0

我自认为PHP初学者,我还在学习正则表达式。下面是我用preg_match_all遇到问题,阵列正则表达式PHP preg_match_all

我的数组正好有下列信息:

;;CARLOS||ANDREW||STEPH||SUE||JUDY||HAROLD||JAMES||KATIE||JESSICA;; 

我想要做的是单独显示每个名字里有大约250不同的名称,数组始终以;;开始并始终以;;结尾所以这里是我的问题,我的第一串负荷正常,但这样做只是名字:

preg_match_all('/^(.+?)\|\|/', $body, $part); 
    foreach ($part[1] as $part){ 
    print_r($part); 

结果是;;CARLOS

哪里$body是名称的巨大列表(数组250+名)。

期望的结果:

CARLOS 
ANDREW 
STEPH 
JUDY 
HAROLD 
JAMES 
KATIE 
JESSICA 

请理解我不能改变输入数组,这是它是什么。所以基本上在第一个数组我加载整个列表,然后我需要通过|打破它字符。

感谢您的任何建议。

+1

你看着[爆炸()](http://php.net/explode)和'str_replace'去除分号? – jprofitt

回答

7

这里没有必要使用正则表达式。 explodetrim将工作得很好。

$str = trim($body, ";"); // Remove semi-colons 
$arr = explode("||", $str); // Return array of strings delimited by double pipes 

print_r($arr); 

输出

Array 
(
    [0] => CARLOS 
    [1] => ANDREW 
    [2] => STEPH 
    [3] => SUE 
    [4] => JUDY 
    [5] => HAROLD 
    [6] => JAMES 
    [7] => KATIE 
    [8] => JESSICA 
) 

See in action.

如果你希望你的期望的结果正好,然后implode上面的输出。

echo implode(" ", $arr); 
// Outputs: CARLOS ANDREW STEPH SUE JUDY HAROLD JAMES KATIE JESSICA 
+0

我不知道你能做到这一点与trim!酷!+1!:-) – Graham

+0

谢谢谢谢谢谢,这开始让我头疼!今天,我学习了内爆和修剪:D – user1294097

0

;;CARLOS||是最小的匹配结果,这是你问的正则表达式引擎做什么。试试这个正则表达式:

preg_match_all('/(?<=\|\||;;)(.+?)(?=\|\||;;)/', $body, $part); 

print_r($part[1]); 
+0

这工作太棒了!完美的我在做什么,但是混乱作为即时通讯不知道为什么这个工程:?(<=我需要做更多的阅读同样是有可能这样做让每名到它自己的阵列也许:?'preg_match_all ( '\ |',$部分,$ name_array)' – user1294097

+0

@ user1294097:本'(...?)'是*零宽度断言*他们的意思是“确保指定的字符是有的,但没有。实际匹配他们。”这使得字符比赛的其余部分。另外,如果你的字符串是完全一样的显示,使用'trim'和'explode'是一个更好的解决方案。 – Ryan

1
$list = explode('||',trim($list,';')); 
0

我会用explode()代替。

<?php 

$string=";;CARLOS||ANDREW||STEPH||SUE||JUDY||HAROLD||JAMES||KATIE||JESSICA;;"; 

$names=explode("||", substr($string,2,strlen($string)-4)); 

print_r($names); 

给我们:

Array 
(
    [0] => CARLOS 
    [1] => ANDREW 
    [2] => STEPH 
    [3] => SUE 
    [4] => JUDY 
    [5] => HAROLD 
    [6] => JAMES 
    [7] => KATIE 
    [8] => JESSICA 
)