以特定字符串开头的正则表达式,并忽略包含特定字符串的表达式

时间:2013-03-06 10:16:50

标签: php regex preg-match

我试图在PHP中编写一个正则表达式,它匹配任何包含'search / site / *'的字符串,但前提是它不包含字符串'ss_language'

以下是我到目前为止:http://regexr.com?3416i 这成功匹配任何'search / site / *',包括'search / site',所以现在我需要排除任何包含'ss_language'的字符串

考虑到这一点,似乎我可以嵌套另一个preg_match来寻找ss_language,但这是与单个正则表达式相比最好的方法吗?一个正则表达式甚至可以实现这一点吗?以下是一些示例以及它们应该返回的内容:

  • 通过 - 搜索/网站
  • Pass - search / site / cat
  • 通行证 - 搜索/网站/狗?f [0] = im_field_technology%3A20858
  • Pass - search / site / cat%20dog?f [0] = im_field_technology%3A20858
  • 失败 - 搜索/网站/ cat%20狗?f [0] = ss_language%3Aen
  • 失败 - 搜索/网站/?f [0] = im_field_technology%3A20858& f [1] = ss_language%3Aen
  • 失败 - 搜索/网站/?f [1] = ss_language%3Aen& f [0] = im_field_technology%3A20858
  • Pass - search / site /?f [0] = im_field_technology%3A20858& f [1] = im_field_technology%3A20875o
  • 失败 - node / 23 / edit

提前感谢您的帮助。我对这些很新。这是一次失败的尝试:http://regexr.com?3416f

3 个答案:

答案 0 :(得分:2)

您可以使用否定前瞻来断言该字符串不包含ss_language

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

如果你只是想要一个真实/错误的答案来判断它是否匹配那么你真的不需要.*$(它只会与search/site匹配可选的/鉴于字符串中没有ss_language(短版本):

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

答案 1 :(得分:0)

您可以查看http://regexr.com?3417a以了解以下正则表达式:

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

确实使用否定前瞻。

答案 2 :(得分:0)

您不需要使用速度较慢的正则表达式。使用strpos()

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

查看: DEMO

它的作用基本上是检查网址是否以search/site开头,如果是,请检查它是否包含ss_language并返回TRUE或此示例中为FALSE或通过/失败。因为你只是在寻找子串,所以根本不需要正则表达式。