0

たとえば、次のような文字列があります。

bool dxDrawImage float posX, float posY, float width, float height, mixed image , float rotation = 0, float rotationCenterOffsetX = 0, float rotationCenterOffsetY = 0, int color = white, bool postGUI = false
bool dxUpdateScreenSource element screenSource, bool resampleNow =false

それからパーツを取得する必要があります。たとえば、次のようになります。

bool dxDrawImage
float posX
float posY
...

私が書いた:

preg_match_all("/(bool|float|int)[a-zA-Z0-9\s=]+/", $txt, $ar);

print_r($ar):

Array ( [0] => Array ( [0] => bool dxDrawImage float posX [1] => float posY [2] => float width [3] => float height [4] => float rotation = 0 [5] => float rotationCenterOffsetX = 0 [6] => float rotationCenterOffsetY = 0 [7] => int color = white [8] => bool postGUI = false ) [1] => Array ( [0] => bool [1] => float [2] => float [3] => float [4] => float [5] => float [6] => float [7] => int [8] => bool ) )

bool dxDrawImage float posX代わりにこの正規表現をキャプチャする理由

bool dxDrawImage
float posX

これを修正する方法は?

4

4 に答える 4

1

変数名に空白を使用できないようにすることができます:

preg_match_all("/(bool|float|int)\s+[a-zA-Z0-9=]+/", $txt, $ar);

使用する場合:

preg_match_all("/(bool|float|int)\s+[a-zA-Z0-9]+(\s+=\s+[chars,possible for value]+)?/", $txt, $ar);
于 2012-07-21T13:00:10.203 に答える
1
preg_match_all("/(\b(?:bool|float|int|element)\s+.*?)(?=\b(?:bool|float|int|element|[,;\n\r]|$))/", $txt, $ar); 
print_r($ar[1]);
于 2012-07-21T13:09:49.647 に答える
0

たぶん、貪欲でないフラグを使用できます。

preg_match_all("/(bool|float|int)[a-zA-Z0-9\s=]+/U", $txt, $ar);
于 2012-07-21T13:02:14.570 に答える
0

ある変数を別の変数から区切る部分は、文字列では少し不明確です。そのため、それぞれを区別するのが少し難しくなります。ただし、発生したパターンを比較的簡単に記述することができます。

((?:bool|float|mixed|int|element) [a-zA-Z]+(?: = ?[a-z0-9]+)?)(?:\s?,\s?|\s|$)
|^-------- variable type -------^     |    ^--- optional ---^|^-- delimiter -^
|                                   name                     |
|                                                            |
`------------------ the interesting part --------------------´

このようなパターンは次の場合に機能しpreg_match_allます。

$pattern = '(((?:bool|float|mixed|int|element) [a-zA-Z]+(?: = ?[a-z0-9]+)?)(?:\s?,\s?|\s|$))';
$variables = array();
if ($r = preg_match_all($pattern, $subject, $matches)) {
    $variables = $matches[1];
}
print_r($variables);

出力:

Array
(
    [0] => bool dxDrawImage
    [1] => float posX
    [2] => float posY
    [3] => float width
    [4] => float height
    [5] => mixed image
    [6] => float rotation = 0
    [7] => float rotationCenterOffsetX = 0
    [8] => float rotationCenterOffsetY = 0
    [9] => int color = white
    [10] => bool postGUI = false
    [11] => bool dxUpdateScreenSource
    [12] => element screenSource
    [13] => bool resampleNow =false
)

もう 1 つの方法は、区切り記号のみを使用して文字列を分割することです。ただし、デリミタの後に変数型とスペースが続きます (先読み):

$pattern = '((?:\s?,\s?|\s)(?=(?:bool|float|mixed|int|element)))';
$variables = preg_split($pattern, $subject);
print_r($variables);

上記と同じ結果が得られます。

于 2012-07-21T15:59:39.407 に答える