5

次のことを考慮してください。

700italic
regular
300bold
300bold900

これらはすべて異なる例であり、1回に実行される行は1つだけです。

期待される結果:

// 700italic
array(
    0 => 700
    1 => itailc
)

// regular
array(
    0 => regular
)

// 300bold
array(
    0 => 300
    1 => bold
)

// 300bold900
array(
    0 => 300
    1 => bold
    2 => 900
)

私は以下を作りました:

(\d*)(\w*)

しかし、それだけでは十分ではありません。2つの「パーツ」(数値|文字列または文字列|数値)しかない場合は機能しますが、3番目の「セグメント」を追加すると機能しません。

助言がありますか?

4

6 に答える 6

5

代わりに使用できますpreg_split。次に、単語と文字の間の位置に一致するルックアラウンドを使用できます。

$result = preg_split('/(?<=\d)(?=[a-z])|(?<=[a-z])(?=\d)/i', $input);

\w文字に加えて、数字(およびアンダースコア)にも一致することに注意してください。

別の方法(マッチング関数を使用)は、すべての一致に対してpreg_match_all数字または文字のみを使用して一致させることです。

preg_match_all('/\d+|[a-z]+/i', $input, $result);

キャプチャの代わりに、結果の配列内の必要な要素すべてに対して単一の一致が得られるようになりました。ただし、最後に配列が必要なだけなので、配列がどこから来たのかは気にしません。

于 2012-12-13T15:43:53.857 に答える
1

PREG_SPLIT_DELIM_CAPTUREフラグを使用できます。

例:

<?php

$key= "group123425";
$pattern = "/(\d+)/";

$array = preg_split($pattern, $key, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
print_r($array);

?>

この投稿もチェックしてください。

于 2012-12-13T15:49:19.193 に答える
1

あなたが探しているpreg_split

preg_split(
    '((\d+|\D+))', $subject, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY
)

デモ

またはpreg_match_all

preg_match_all('(\d+|\D+)', $test, $matches) && $matches = $matches[0];

デモ

于 2012-12-13T15:56:15.887 に答える
0

次のようなパターンを使用できます。

(\d*)([a-zA-Z]*)(\d*)

preg_match_allまたは、次のようなパターンで使用できます。

'/(?:[a-zA-Z]+|\d+)/'

次に、それぞれが文字のみまたは数字のみで構成される任意の数のセグメントを照合できます。

于 2012-12-13T15:47:31.367 に答える
0

多分このようなもの:

(\d*)(bold|italic|regular)(\d*)

また

(\d*)([a-zA-Z]*)(\d*)
于 2012-12-13T15:51:36.523 に答える
0

分割するのではなく、一致させる必要があります。

それでもあなたはそれを使ってそれを分割することができます

(?<=\d)(?=[a-zA-Z])|(?<=[a-zA-Z])(?=\d)
于 2012-12-13T15:44:04.797 に答える