簡體   English   中英

以特定字符串開頭的正則表達式,並忽略包含特定字符串的表達式

[英]Regular expression that starts with a certain string and ignores those that contain a specific string

我試圖在PHP中編寫一個正則表達式,它匹配任何包含'search / site / *'的字符串,但前提是它不包含字符串'ss_language'

這是我到目前為止: http ://regexr.com?3416i這成功匹配任何'搜索/網站/ *',包括'搜索/網站'所以現在我需要的位不包括任何包含'ss_language'的字符串

考慮到這一點,似乎我可以嵌套另一個preg_match來尋找ss_language,但這是與單個正則表達式相比的最佳方式嗎? 一個正則表達式甚至可以實現這一點嗎? 以下是一些示例以及它們應返回的內容:

  • 通行證 - 搜索/網站
  • 通行證 - 搜索/網站/貓
  • 通過 - 搜索/網站/狗?f [0] = im_field_technology%3A20858
  • Pass - 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
  • 失敗 - node / 23 / edit

在此先感謝您的幫助。 我對這些很新。 這是一次失敗的嘗試: http//regexr.com?3416f

您可以使用否定前瞻來斷言該字符串不包含ss_language

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

如果你只是想要一個真實/錯誤的答案,它是否匹配,那么你真的不需要.*$ (它只會匹配search/site與可選/如果字符串中沒有ss_language (短)版):

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

您可以查看http://regexr.com?3417a以獲取以下正則表達式:

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

它確實使用負面的前瞻。

您不需要使用速度較慢的正則表達式。 使用strpos()

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

看看: DEMO

基本上它的作用是檢查URL是否以search/site開頭,如果是,則檢查它是否不包含ss_language並在此示例中返回TRUEFALSE或Pass / Fail。 因為您只是在尋找子串,所以根本不需要正則表達式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM