0

二重引用符で囲まれていない、関数である可能性のある単語に一致する PHP 正規表現に取り組もうとしています。関数である可能性がある二重引用符で囲まれているものはすべて無視します。以下はすでに「hello(world)」に一致しています。そして、'hello(world)' を 1 つの配列に配置し、次に 'hello' を別の配列に配置します。ただし、上記のように追加しない条件が欲しいです。

preg_match_all('#(\w*)\s*\(.*?\)#i',$str,$m);

私はそれで遊んでみました。そして、次の例を使用して私を助けてください。

(?<!a)b

適用するとパターンが間違っていますが。誰かがこの問題について何か助けがあれば、私はそれを感謝します.

正規表現の現在の設計の出力として。次の例を見てください。

入力:

one($two) two($1) three($2one)}meme1(you2) this(that) die ("今") these function myfunc($me) empty()

出力:

array (
  0 => 
  array (
    0 => 'one($two)',
    1 => 'two($1)',
    2 => 'three($2one)',
    3 => 'meme1(you2)',
    4 => 'this(that)',
    5 => 'die (\\"meohmy\\")',
    6 => 'myfunc($me)',
    7 => 'empty()',
  ),
  1 => 
  array (
    0 => 'one',
    1 => 'two',
    2 => 'three',
    3 => 'meme1',
    4 => 'this',
    5 => 'die',
    6 => 'myfunc',
    7 => 'empty',
  ),
)

CodeIgniter はデフォルトでセッション Cookie を使用してセッション データを保存するため、Cookie の最大長に達しました。Cookie は、ドメインごとに約 4093 の bye データを保持できます (したがって、2 つの Cookie がある場合、合計サイズはそれを超えることはありません)。

CI でセッション ストアにデータベースを使用する場合 (現在のように)、Cookie のサイズを小さくする必要があります。CI はセッション メタデータのみを cookに配置し、ユーザーデータをデータベースに配置します。CI のバージョンを確認してください。古いバージョンを使用している可能性があります。

あるいは、 NativeSessionのようなセッション ライブラリの置き換えを確認することもできます。このコードは同じ API を模倣しますが、php の組み込みセッション機能を使用するため、ファイルまたは memcached でバックアップされたストレージも簡単に使用できます。

4

1 に答える 1

0

コメントで述べたように、任意の長さの後読みはできません。ただし、できるのは任意の長さの先読みです。" を数えるために後読みしたかったのと同じように、後に来る人を数えることができます。次の行に沿った何か:

/(\w+)\s*\(.*?\)(?=(?:[^"]|".*?")*$)/

ただし:
- 適切にフォーマットされたコードにこれを適用するようにしてください
- エスケープされた " にだまされる場合 (それを修正できます。私には勇気がありません)
- わざわざパフォーマンスを見ていなかったので、ここで仕事があります

全体として、これは良い考えではないかもしれません。

編集:
それは何をしますか?私はあなたの正規表現を取り、あなたの一致の後にチェックを追加しました. 一致するものが見つかるたびに、文字列の最後まで "" のペア番号があるかどうかをチェックします (大きな文字列に対しては非常に非効率的です)。

より効率的な方法は?もちろん。正規表現で未定義の数のグループをキャッチできないという事実は面倒です。これは、文字列をループする必要があることを意味します。基本的に、すべての引数で preg_match を使用し (4 番目の引数のおかげで「matches」配列内の一致の位置を取得し ( preg_match docを参照)、5 番目でループします)、次のようなものを使用します。

/(?:[^"]|".*?")*?(\w+)\s*\(.*?\)/

(私がこれを書いているとき、私はそれもそれほど効率的ではないと考えていますが、それでも大きな文字列に対しては優れています。)
(注:私は非常に眠いのでテストしていません。どちらの解決策でも、質問を閉じてください。そうでない場合は、とにかく戻ってきます)

于 2013-03-31T00:00:35.430 に答える