3

「search/site/*」を含む任意の文字列に一致する正規表現を PHP で記述しようとしていますが、文字列「ss_language」が含まれていない場合に限ります。

http://regexr.com?3416i これは、「search/site」を含むすべての「search/site/*」と正常に一致するため、「ss_language」を含む文字列を除外するビットが必要です。

これについて考えると、別の preg_match をネストして ss_language を探すことができるように思えますが、1 つの正規表現に対してそれを行うのが最善の方法ですか? これは1つの正規表現でも可能ですか? いくつかの例とそれらが返すものを次に示します。

  • パス - 検索/サイト
  • パス - 検索/サイト/猫
  • パス - search/site/dog?f[0]=im_field_technology%3A20858
  • パス - search/site/cat%20dog?f[0]=im_field_technology%3A20858
  • 失敗 - search/site/cat%20dog?f[0]=ss_language%3Aen
  • 失敗 - search/site/?f[0]=im_field_technology%3A20858&f[1]=ss_language%3Aen
  • 失敗 - search/site/?f[1]=ss_language%3Aen&f[0]=im_field_technology%3A20858
  • パス - search/site/?f[0]=im_field_technology%3A20858&f[1]=im_field_technology%3A20875o
  • 失敗 - ノード/23/編集

助けてくれてありがとう。私はこれらにかなり慣れていません。これは失敗した試みです: http://regexr.com?3416f

4

3 に答える 3

2

否定先読みを使用して、文字列に含まれていないことをアサートできます。ss_language

^search/site/?(?!.*ss_language.*).*$

一致するかどうかについて真/偽の答えが必要な場合は、実際には必要ありません(文字列のどこにもない場合、オプションとの.*$み一致します(短いバージョン):search/site/ss_language

^search/site/?(?!.*ss_language)
于 2013-03-06T10:26:43.320 に答える
0

遅くなる正規表現を使用する必要はありません。strpos()を使用します。

$status = (0 === strpos($url, 'search/site') && FALSE === strpos($url, 'ss_language'))
    ? 'PASS'
    : 'FAIL';

チェックアウト:デモ

基本的には、URL が で始まるかどうかをsearch/site確認し、含まれている場合は、含まれていないかどうかを確認し、この例では成功/失敗ss_languageを返すTRUEかどうかを確認します。FALSE部分文字列を探しているだけなので、正規表現はまったく必要ありません。

于 2013-03-06T11:03:18.257 に答える
0

次の正規表現については、 http://regexr.com? 3417aを確認できます。

^search/site/?(?:(?!ss_language).)*$

それは確かに否定的な先読みを使用しています。

于 2013-03-06T10:32:52.657 に答える