2016-07-15 6 views
0

私は連結によってより大きくなる文字列変数を持っています。私はすべての部分文字列(すべてのループ反復)を検証する必要があります。ステップごとに一致させる方法

文字列の最後の有効な形式に一致するパターンを作成しました。

文字列のすべての部分文字列(部分的ですが正しい順序)を検証するにはどうすればよいですか?

$pattern = "#\{/?MYTAG(\d*)?\}#i" 
    $myString = '' 

    while (true) { 
    $myString .= $aChar; 

     // { => valid 
     // {m => valid 
     // {my => valid 
     // {myz => invalid break the loop 

     if (preg_match($pattern, $myString)) { 

     } 
    } 

文字を任意にするように変更された?を使用しようとしました。しかし、それは部分的な文字列と一致します:

// {mysdf 
// it matches {my 
// I want to return false, not get the valid part of the string 

これは意味があると思います。

+0

あなたはおそらくこのようなものを探しています: 'while(preg_match($ pattern、$ myString)){' – arkascha

+0

@arkascha私のパターンは文字列の最後の形式にしか一致しません。つまり、完全一致の場合にのみ一致します。 – giannisf

+2

PHP正規表現はファジー/部分一致をサポートしていません。あなたは別の方法を見つける必要があります。 *(例えば、あなたは閉じた中かっこを待ってからあなたのパターンをテストすることができます)* –

答えて

1

正規表現が最後の文字列と一致するかどうかをテストしたい場合は、最後の文字列の残りの文字を追加し、各繰り返しでテストしてみましょう。

現在の文字列が「my」で、「mytag」を検索している場合は、「mytag」.substring(2)を「my」に連結して最終文字列を作成します。正規表現が連結された文字列にマッチすると、それまでの文字列が有効であることがわかります。

私がそこに持っている特定のsubstring()関数を無視します。これは単なる擬似コードです。

$pattern = "#\{/?MYTAG(\d*)?\}#i"; 
$myString = ''; 
$counter = 0; 
$finalString = "MYTAG"; 

while (true) { 
$myString .= $aChar; 

    // { => valid 
    // {m => valid 
    // {my => valid 
    // {myz => invalid break the loop 

    if (preg_match($pattern, $myString . $finalString.substring($counter + 1))) { 

    } 
    $counter++; 
} 

主要欠点は、あなたの場合は、この唯一の作品である: - (私は実際には行っていないし、それを見上げPHPの実際のsubstringメソッドを使用しません)。ここ

は、より完全な例ですあらかじめ最終的な文字列を知っているが、あなたのように思える。しかし、これ以外にも、ちょっとした回避策として役立つかもしれません。もう一度、私が使用した特定の部分文字列関数は擬似コードであることに注意してください - 実際にPHPの部分文字列関数を調べなかったのですが、私はその部分文字列が存在することを知っています。

EDIT:私はこの記事を投稿する前に@arkaschaのコメントが表示されませんでした。これは、彼らが話していることの一例です。

関連する問題