2016-05-23 9 views
1

私はpreg_replace_callbackを使用して、送信メールの特定のURLにパラメータを追加しています。pcre.trackback limit php preg_replace_callback()

プロセスは、データベースからの電子メールテンプレートをアップロードし、同じデータベースからユーザーのリストを引っ張って、その後、この関数を使用して電子メールの本文を渡すことによって動作します。

function add_user_login($body, $user_id, $user_hash) { 
    ini_set('pcre.backtrack_limit',1000000000); 
    $return_string = preg_replace_callback('@(https?://([-\w\.]+)+mydomain.com([^"]*))@', function ($matches) use ($user_id, $user_hash) { 

     if (strpos($matches[0], "?") === false) { 
     return $matches[0] . "?user_id=" . $user_id . "&user_hash=" . $user_hash; 
     } else { 
     return $matches[0] . "&user_id=" . $user_id . "&user_hash=" . $user_hash; 
     } 
    }, $body); 

    return $return_string; 
} 

目標が持つことは何もあり"www.mydomain.com"または "mydomain.com"では、GETパラメータ "user_id"と "user_hash"が追加されます。残念ながら、既存のGETパラメータなどが存在していない可能性もありますが、これはこれまでに見つけた最良の方法でした。

私の問題は、何らかの理由でテストでbacktrack_limitエラーが発生し、backtrack_limitを増やさなければならないということです。これはテストでは機能しましたが、それは非常に遅いです。

他に誰かが同様のことをしましたか?正規表現を変更しようとしましたが、バックトラックの問題はワイルドカードの使用に起因していると思いますが、変更しても機能しなくなりました。

+1

ちょうど交換を参照してください([ - \ W \。] +)+' 'と - +'して、再試行してください[W \。]。 –

答えて

1

あなたが持っている正規表現には、([-\w\.]+)+のネストされた量指定子が含まれています。このサブパターンは、同じ文字に一致するサブパターンで囲まれていると、大量のバックトラッキングステップが発生します。

regex demo:26,664ステップを参照してください。 https://see.my-cool-site.here.mydomain.c(一致しない文字列)では、致命的なバックトラッキングの問題が発生します。

ソリューションはちょうど[-\w.]+を使用することです:

'@(https?://[-\w\.]+mydomain.com([^"]*))@' 

あなたがmydomain.com前に値を必要とする場合は(ただし、あなたのコードから判断し、あなただけの全体の一致を必要とする)パターン上のキャプチャグループを維持すること:

'@(https?://([-\w\.]+)mydomain.com([^"]*))@' 

は `regex demo

+0

なぜ誰もこの回答を下落させるだろうか?問題を説明し、解決策を提供します。 –

+0

ええ、それは奇妙です。それは私がbtwではなかった。私は答えを否定し、答えを受け入れました。誰かが誤ってそれを落としてしまったのだろうかと思う。あなたの答えをありがとう、それは非常に有用だった。 –

+0

ようこそ。 –