3

我正在尝试在 PHP 中编写一个正则表达式,它将匹配任何包含“搜索/站点/*”的字符串,但前提是它不包含字符串“ss_language”

这是我到目前为止所拥有的:http : //regexr.com?3416i 这成功匹配任何“搜索/站点/*”,包括“搜索/站点”,所以现在我需要排除任何包含“ss_language”的字符串的位

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

  • 通过 - 搜索/站点
  • 通过 - 搜索/站点/猫
  • 通过 - search/site/dog?f[0]=im_field_technology%3A20858
  • 通过 - search/site/cat%20dog?f[0]=im_field_technology%3A20858
  • 失败 - 搜索/站点/cat%20dog?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
  • 通过 - 搜索/站点/?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

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

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

它确实使用了负前瞻。

于 2013-03-06T10:32:52.657 回答
0

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

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

查看:演示

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

于 2013-03-06T11:03:18.257 回答