0

私は独学の 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

入力配列を変更できないことを理解してください。それはそれです。したがって、基本的に最初の配列でリスト全体をロードした後、 | で分割する必要があります。文字。

アドバイスをありがとう。

4

4 に答える 4

7

ここで正規表現を使用する必要はありません。explodeそしてtrimうまくいきます。

$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
)

実際に見てください。

目的の結果が正確に必要な場合はimplode、上記の出力を使用してください。

echo implode(" ", $arr);
// Outputs: CARLOS ANDREW STEPH SUE JUDY HAROLD JAMES KATIE JESSICA
于 2012-06-06T02:26:01.783 に答える
1
$list = explode('||',trim($list,';'));
于 2012-06-06T02:26:38.060 に答える
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
)
于 2012-06-06T02:27:45.620 に答える
0

;;CARLOS||利用可能な最小の一致です。これは、正規表現エンジンに求めていることとまったく同じです。次の正規表現を試してください。

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

print_r($part[1]);
于 2012-06-06T02:23:32.767 に答える